【问题标题】:How do I use regular expression capturing groups with JFlex?如何在 JFlex 中使用正则表达式捕获组?
【发布时间】:2011-04-23 13:02:46
【问题描述】:

虽然这个问题是关于 JFlex 的,但它可能也适用于其他扫描仪生成器,例如 lex、flex。

如果我有一些规则,我如何在该规则的一部分中创建一个捕获组,并将该捕获组的结果用作在规则匹配时调用的代码的参数?

例如,假设我有一个简单的规则来匹配一个 SGML 标签:

"<"[a-zA-Z]+">"    {return new Token(Type.OPEN_TAG);}

如何捕获内部字符部分([a-zA-Z]+)并将其用作我的 Token 构造函数中的参数?

编辑:我知道我可以简单地使用 yytext() 来获取整个匹配值,然后在代码中的其他地方分离部分,但这似乎会使事情变得比需要的更复杂。

【问题讨论】:

    标签: regex capturing-group jflex


    【解决方案1】:

    扫描仪生成器通常不支持捕获组,老实说,我从未在扫描仪生成器中看到对它们的有效需求。您通常在其他 RegEx 引擎中使用捕获组的大多数事情都可以在解析器中或通过操作中的一段简单代码得到更好的处理。

    类似下面的东西应该可以工作。

    "<"[a-zA-Z]+">"    {
                         String matchedText = yytext();
                         String label = matchedText.substring(1, matchedText.length() - 1);
                         return new Token(Type.OPEN_TAG, label);
                       }
    

    实施组捕获往往会干扰扫描仪生成器执行的许多优化以减小转换表的大小。我从未使用过 JFlex,但我似乎记得一些关于 flex 支持某种有限形式的回溯和向前/向后查看的内容,但如果使用,则会发出有关性能的警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多