【问题标题】:jflex: Why does this regex match?jflex:为什么这个正则表达式匹配?
【发布时间】: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 文件中不再包含指定的正则表达式。这个状态机会有人帮忙吗?

标签: regex jflex


【解决方案1】:

解决方法是正确的,在版本 1.5.0 之前,\s 不是 JFlex 中的特殊转义序列,仅表示字母 s。从版本 1.5.0 开始,正则表达式应该可以按预期工作。

@ 不是特殊字符,不需要转义。

【讨论】:

    【解决方案2】:

    是否 \ 被转义以便传递的正则表达式实际上是 "///"s[^@s].*

    尝试双重转义,以便使用"///"\\s[^@\\s].*

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2013-04-19
      • 2011-09-17
      • 2014-05-14
      • 1970-01-01
      相关资源
      最近更新 更多