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

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам