re2c: синтаксическая ошибка при попытке сопоставить строку
Я пытаюсь использовать re2c, но это дает мне синтаксическую ошибку в этом регулярном выражении:
(["'])((\\{2})*|(.*?[^\\](\\{2})*))\1
Что с этим не так? Это должно соответствовать строке в двойных или одинарных кавычках
1 ответ
Re2c, как и большинство генераторов сканеров, реализует только примитивы регулярных выражений, которые могут быть реализованы за линейное время без обратного отслеживания. Как следствие, он не реализует обратные ссылки, захваты (хотя вы можете вставлять маркеры тегов в регулярное выражение) или нежадные совпадения. (Технически, нежадные совпадения могут быть реализованы за линейное время. Но сделать это правильно немного сложно.)
Обратная ссылка в вашем регулярном выражении на самом деле просто аббревиатура, поскольку она может принимать только два значения: либо это ["]
или [']
. Разделение двух альтернатив также позволяет легко избежать необходимости в нежадном сопоставлении:
Если вы не разрешаете символы новой строки в строках:
["]([^"\\\n]|\\.)*["]|[']([^'\\\n]|\\.)*[']
Если вы разрешаете символы новой строки в строках, только если они экранированы:
["]([^"\\\n]|\\(.|\n))*["]|[']([^'\\\n]|\\(.|\n))*[']
Если вы разрешаете символы новой строки в любом месте строк:
["]([^"\\]|\\(.|\n))*["]|[']([^'\\]|\\(.|\n))*[']
(Как и flex, re2c считает .
для соответствия любому символу, кроме символа новой строки, в то время как классы отрицательных символов включают символы новой строки, если специально не указано иное. Поэтому обработка новой строки часто должна быть явной.)
Обратите внимание, что re2c реализует строки литералов в кавычках (например, flex), поэтому "
а также '
- это метасимволы, функция, которая присутствует в очень немногих библиотеках регулярных выражений. (В отличие от flex, строки в одинарных кавычках принимаются и обрабатываются как нечувствительные к регистру. В flex - одинарные кавычки, а не метасимволы.) Следствием этого является то, что вы должны экранировать их, чтобы сделать их буквальными символами; обычное соглашение состоит в том, чтобы поместить их в класс символов, как указано выше, вместо того, чтобы использовать представление "падающая древесина", которое может быть трудно читать.
Прочтите документацию по шаблонам re2c, которые могут иметь некоторые существенные отличия от библиотек регулярных выражений, к которым вы привыкли (или для которых вы нашли примеры в веб-поиске).