没有第一个字母出现的字母表的正则表达式是什么?

What's the regular expression for an alphabet without the first occurrence of a letter?

我正在尝试使用 FLEX 来识别我需要的一些正则表达式。 我正在寻找的是给定一组字符,比如 [A-Z],我想要一个可以匹配第一个字母的正则表达式,无论它是什么,然后是可以是 [=10= 中的任何内容的第二个字母] 除了第一个字母。

例如,如果我给你AB,你匹配它,但如果我给你AA,你不匹配。所以我有点想找一个类似的正则表达式 [A-Z][A-Z^除第一组选出的外].

对于出现更多的字母,如何实施?假设我想匹配 3 个字母,并且每个新字母都不是以前的字母。例如 ABC 但不是 AAB.

谢谢!

(数学)正则表达式没有上下文。在 (f)lex 中——与大多数正则表达式库不同,正则表达式实际上是正则的——没有反向引用、正向或负向引用之类的东西。

因此,使用 flex 模式实现目标的唯一方法是枚举可能性,这对于两个字母来说是乏味的,而对于更多字母则不切实际。两个字母的大小写类似于 (abbreviated);

A[B-Z]|B[AC-Z]|C[ABD-Z]|D[A-CE-Z]|…|Z[A-Y]

逆表达式也有 26 种情况,但更易于输入(和阅读)。您可以使用 (f)lex 的第一个最长匹配规则来使用它:

AA|BB|CC|DD|…|ZZ    { /* Two identical letters */ }
[[:upper:]]{2}  { /* This is the match */ }

可能,这些都不是最好的解决方案。但是,我认为在不了解更多细节的情况下我无法提供更好的建议。关键是知道如果字母确实匹配(您未指定)要采取什么操作。以及其他模式是什么。 (回想一下,词法扫描器旨在将输入分成标记,尽管一旦识别出标记,您就可以随意忽略它。)

Flex 确实具有许多有用的功能,可用于更灵活的令牌处理,包括 yyless(重新扫描部分或全部令牌)、yymore(将与下一个标记匹配)和 unput(将字符插入输入流)。还有 REJECT,但您应该先尝试其他解决方案。有关详细信息,请参阅 the flex manual chapter on actions

所以最简单的解决方案可能是只匹配任意两个大写字母,然后在操作中检查它们是否相同。