这是一个真正的正则表达式,它直接指定一个有限自动机,可以一个一个地输入字符串的字符,如果字符串不是 NIL 上的变体,它将达到接受状态:
(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)
这将适用于不实施环视黑客的经典正则表达式引擎,并且可以转换为极快的 DFA。
您可能必须使用^
and来锚定它$
,具体取决于您使用的正则表达式函数类型:(整个字符串)匹配语义或子字符串搜索语义。
例如,grep 测试:
# rejects lines like nIl and NiL but accepts all else
# including blank lines:
grep -E '^(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)$'
这里的想法是:
- 所有长度为 1、2 或 4 或更多的字符串都匹配。
- 一个三字符的字符串匹配当且仅当:
- 它不以 N 或 n 开头;或者
- 它中间没有 I 或 i;或者
- 它的末尾没有 L 或 l。
NIL 和 Nil 被拒绝的原因是它们不符合所有三个规则 2.1、2.2 和 2.3。NIL 确实以 N 开头,因此它在 2.1 中失败。它中间确实有一个 I,所以它失败了 2.2,它的末尾确实有一个 L,所以它失败了 2.3。