没有第一个字母出现的字母表的正则表达式是什么?
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。
所以最简单的解决方案可能是只匹配任意两个大写字母,然后在操作中检查它们是否相同。
我正在尝试使用 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。
所以最简单的解决方案可能是只匹配任意两个大写字母,然后在操作中检查它们是否相同。