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].*