jflex: Почему это регулярное выражение совпадает?

в моем лексере я написал следующее регулярное выражение:

"///"\s*[^@\s].*

Я выполнил byacc/j в режиме отладки и обнаружил, что следующая строка соответствует регулярному выражению.
Но почему? это регулярное выражение соответствует этой строке?

/// @Service( version="1.0.0" )

Я также пробовал "///"\s*[^\@\s].*, если @ является специальным символом, но он тоже совпадает. о.О

Я думал, что мое регулярное выражение будет соответствовать только строке, начинающейся с ///, за которой следуют необязательные пробелы. Затем должен идти любой непробельный символ, кроме @, за которым следуют любые символы.

Редактировать: извините, я имел в виду, что регулярное выражение используется в jflex, не byacc/j.

Временное решение: в документации jflex я не нашел \s escape-последовательность, поэтому я попробовал это регулярное выражение "///"[ \t\f]*[^@ \t\f].*, и оно сработало. Кажется, что escape-символ \s не поддерживается и молча игнорируется jflex.


person Marc-Christian Schulze    schedule 22.08.2011    source источник
comment
Любой механизм регулярных выражений PCRE, с которым я знаком, не сопоставляет строку "/// @Service( version="1.0.0" )" с использованием шаблона: ///\s*[^@\s].* (я удалил кавычки, так как это специфично для byacc/j).   -  person Bart Kiers    schedule 22.08.2011
comment
Но регулярное выражение, используемое в byacc/j, делает это.   -  person Marc-Christian Schulze    schedule 22.08.2011
comment
Ага, это я понимаю :). Я просто хотел, чтобы вы знали, что с точки зрения регулярных выражений вы правы в своих предположениях.   -  person Bart Kiers    schedule 22.08.2011
comment
Можете ли вы наблюдать за процессом сопоставления, как в Perl? Это может очень помочь!   -  person pb149    schedule 22.08.2011
comment
JFlex, кажется, преобразует данное регулярное выражение в конечный автомат. Таким образом, в сгенерированном файле Yylex.java больше не содержатся указанные регулярные выражения. Поможет ли кому-нибудь эта государственная машина?   -  person Marc-Christian Schulze    schedule 22.08.2011


Ответы (2)


Обходной путь правильный, до версии 1.5.0 \s не было специальной управляющей последовательностью в JFlex, а просто означало букву s. Начиная с версии 1.5.0 регулярное выражение должно работать должным образом.

@ не является специальным символом и не требует экранирования.

person lsf37    schedule 16.04.2015

Является ли \ экранированным, чтобы передаваемое регулярное выражение было фактически "///"s[^@s].*

Попробуйте двойное экранирование, чтобы использовать "///"\\s[^@\\s].*

person Bob Vale    schedule 22.08.2011