Как записать регулярное выражение для соответствия строковому литералу, где Escape является удвоением символа кавычки?

Я пишу синтаксический анализатор с помощью сгиба, который должен определить строковые литералы ФОРТРАНА. Они заключаются в кавычки с одинарными кавычками с символом ESC, удвоенным одинарные кавычки. т.е.

'I don''t understand what you mean'

допустимая завершенная строка ФОРТРАНА.

Сгиб берет вход в регулярном выражении. Моя попытка до сих пор не работает, и я не понимаю почему.

t_STRING_LITERAL = r"'[^('')]*'"

Какие-либо идеи?

8
задан FrustratedWithFormsDesigner 26 January 2010 в 22:47
поделиться

2 ответа

Строковый литерал - это:

  1. Открытая одиночная кавычка, за которой следует:
  2. Любое количество двойных одиночных кавычек и не одиночных кавычек, затем
  3. Закрытая одиночная кавычка.

Таким образом, наш регекс:

r"'(''|[^'])*'"
20
ответ дан 5 December 2019 в 06:53
поделиться

Вы хотите что-то вроде этого:

r"'([^']|'')*'"

Это говорит о том, что внутри одной цитаты вы можете иметь двойные кавычки или символ нецитали.

Кронштейны определяют класс символов, в котором вы перечисляете символы, которые могут или не могут совпадать. Это не позволяет ничего сложнее, чем это, поэтому пытаясь использовать скобки и соответствовать последовательности нескольких символов ('') не работает. Вместо этого ваш класс [^ ('')] класс символов эквивалентен [^ '()] , i.e. Это совпадает с ни одной цитатой или левой или правой скобками.

4
ответ дан 5 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: