gpt4 book ai didi

regex - jflex 最有效的前瞻替代品

转载 作者:行者123 更新时间:2023-12-04 01:41:28 25 4
gpt4 key购买 nike

我正在用 jflex 编写分词器。我需要将像 interferon-a 这样的单词匹配为一个标记,像 interferon-alpha 这样的单词匹配为三个。

显而易见的解决方案是前瞻,但它们在 jflex 中不起作用。对于类似的任务,我编写了一个函数来匹配匹配模式后的一个额外的通配符,检查它是否是 Java 代码中的空格,并将它推回匹配字符串的一部分或不包含一部分。

REGEX = [:letter:]+\-[:letter:]\.

从字符串 interferon-alpha 匹配 interferon-al。然后,在 Java 代码部分,它会检查匹配的最后一个字符是否为空格。它不是,所以 -al 将被推回并返回 interferon

interferon-a 的情况下,空格将被推回并返回 interferon

但是,如果匹配的字符串没有任何成功,则此功能不起作用。而且,它看起来很笨重。因此,我想知道是否有任何“更好”的方法来确保后面的字符是一个空白而不实际匹配并返回它。

最佳答案

JFlex 与 (f)lex 一样,当然有前瞻功能。与 Java regex 前瞻断言不同,JFlex 前瞻只能在匹配结束时应用,但在其他方面是相似的。在 Semantics section of JFlex manual 中进行了描述:

In a lexical rule, a regular expression r may be followed by a look-ahead expression. A look-ahead expression is either $ (the end of line operator) or / followed by an arbitrary regular expression. In both cases the look-ahead is not consumed and not included in the matched text region, but it is considered while determining which rule has the longest match…

所以你当然可以写规则:

[:letter:]+\-[:letter:]/\s

但是,您不能将这样的规则放在宏定义中 (REGEX = …),正如手册中提到的(在 section on macros 中):

The regular expression on the right hand side must be well formed and must not contain the ^, / or $ operators.

因此先行运算符只能在模式规则中使用。

请注意,\s 匹配任何空白字符,包括换行符,而 . 匹配任何换行符。我认为这就是导致您评论 REGEX = [:letter:]+\-[:letter:]\. “如果匹配的字符串没有任何成功则不起作用”(我是猜测您的意思是“在同一行上没有任何后续内容,而且您打算编写 . 而不是 \.) .

与其测试后面的空格,您可能(取决于您的语言)更喜欢测试非单词字符:

[:letter:]+\-[:letter:]/\W

或者将更精确的规范制作为一组 Unicode 属性,如 \W 的定义(也可在 JFlex 手册的链接部分中找到)。

说了这么多,我想重复 my previous answer to a similar question 的建议你的:把更具体的模式放在第一位。例如,使用以下一对模式将保证第一个模式选择带有单个字母后缀的单词,同时避免显式回推的需要。

[:letter:]+(-[:letter:])?   { /* matches 'interferon' or 'interferon-a' */ }
[:letter:]+/-[:letter:]+ { /* matches only 'interferon' from 'interferon-alpha' */ }

当然,在这种情况下,您可以通过在第二次重复中使用 {2,} 而不是 + 轻松避免第二个模式和第一个模式之间的冲突,但是依靠模式排序是完全可以的,因为保证模式不重叠通常很不方便。

关于regex - jflex 最有效的前瞻替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com