如何使用JFlex使用正则表达式捕获组?

时间:2010-10-10 19:24:21

标签: regex capturing-group jflex

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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支持一些有限形式的回溯并向前/向后看,但如果使用它会发出关于性能的警告。