regex - 如何在 JFlex 中使用正则表达式捕获组?

标签 regex capturing-group jflex

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

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

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

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

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

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

最佳答案

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

像下面这样的东西应该可以工作。

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

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

关于regex - 如何在 JFlex 中使用正则表达式捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901835/

相关文章:

c# - 从 Div 标签中提取内容 C# RegEx

javascript - 正则表达式从YouTube获取get_video_info响应的一部分

java - 正则表达式无法捕获所有组

c# - 带有可选部分的正则表达式不会创建反向引用

Java 正则表达式 : how to back-reference capturing groups in a certain context when their number is not known in advance

computer-science - 组合语法 中缀 后缀 前缀

php - 这个正则表达式我做错了什么?

python - 从 python 中的文件中删除特定行

java - 连接 CUP 和 jflex

java - 使用 byaccj 构建 ast 时出错