【发布时间】:2011-08-22 10:28:47
【问题描述】:
在我的词法分析器中,我编写了以下正则表达式:
"///"\s*[^@\s].*
我在调试模式下执行了byacc/j,它指出以下行与正则表达式匹配。
但是为什么这个正则表达式匹配这一行呢?
/// @Service( version="1.0.0" )
我也试过"///"\s*[^\@\s].*,以防@是一个特殊字符,但它也匹配。 o.O
我认为我的正则表达式只会匹配以/// 开头的字符串,后跟可选的空格。除了@ 之外的任何非空白字符都必须出现,后跟任何字符。
编辑:对不起,我的意思是 jflex 中使用了正则表达式,不是 byacc/j。
解决方法:在jflex documentation 中我没有找到任何\s 转义序列,所以我尝试了这个正则表达式"///"[ \t\f]*[^@ \t\f].*,它成功了。似乎 jflex 不支持 \s 转义字符并默默忽略。
【问题讨论】:
-
任何我熟悉的 PCRE 正则表达式引擎,not 使用以下模式匹配字符串
"/// @Service( version="1.0.0" )":///\s*[^@\s].*(我删除了引号,因为这是 byacc/j具体)。 -
但是 byacc/j 中使用的正则表达式可以。
-
是的,我明白 :)。我只是想让你知道,从正则表达式的角度来看,你的假设是正确的。
-
你能像在 Perl 中一样查看匹配过程吗?这会很有帮助!
-
JFlex 似乎将给定的正则表达式转换为状态机。所以在生成的 Yylex.java 文件中不再包含指定的正则表达式。这个状态机会有人帮忙吗?