Tox*_*e 7 0 regex compiler-construction flex-lexer
我正在尝试使用 FLEX 来识别我需要的一些正则表达式。我正在寻找的是一组字符,比如说[A-Z],我想要一个正则表达式,无论它是什么,它都可以匹配第一个字母,然后是第二个字母,[A-Z]除了第一个字母之外,它可以是任何字母。
例如,如果我给你AB,你匹配它,但如果我给你AA你不匹配。所以我正在寻找一个类似于[A-Z][A-Z^除了在第一组中选择的内容的正则表达式
]。
对于更多出现的字母,如何实现这一点?假设我想匹配 3 个字母而不是每个新字母都来自以前的字母。例如ABC但不是AAB。
谢谢!
(数学)正则表达式没有上下文。在 (f)lex 中——正则表达式实际上是正则的,与大多数正则表达式库不同——没有反向引用,正面或负面。
因此,使用 flex 模式实现目标的唯一方法是枚举可能性,这对于两个字母来说是乏味的,而对于更多字母则不切实际。两个字母的大小写类似于(缩写);
A[B-Z]|B[AC-Z]|C[ABD-Z]|D[A-CE-Z]|…|Z[A-Y]
Run Code Online (Sandbox Code Playgroud)
逆表达式也有 26 种情况,但更容易输入(和阅读)。您可以使用 (f)lex 的 first-longest-match 规则来利用它:
AA|BB|CC|DD|…|ZZ { /* Two identical letters */ }
[[:upper:]]{2} { /* This is the match */ }
Run Code Online (Sandbox Code Playgroud)
可能,这两个都不是最好的解决方案。但是,我不认为我可以在不了解更多细节的情况下提供更好的建议。关键是知道如果字母匹配,你想采取什么行动,你没有指定。以及其他模式是什么。(回想一下,词法扫描器旨在将输入划分为标记,尽管一旦识别出标记,您就可以随意忽略它。)
Flex 确实提供了许多有用的功能,可用于更灵活的令牌处理,包括yyless(重新扫描部分或全部令牌)、yymore(将匹配与下一个令牌组合)和unput(将字符插入到输入流)。还有REJECT,但您应该先尝试其他解决方案。有关更多详细信息,请参阅有关操作的 flex 手册章节。
所以最简单的解决方案可能是匹配任意两个大写字母,然后在动作中检查它们是否相同。