否定正则表达式

时间:2012-09-10 10:22:25

标签: regex computation-theory

我不确定它是如何被称为:否定,互补或反转。这个概念就是这样。例如,字母“ab”

R = 'a'
!R = the regexp that matche everyhting exept what R matches

在这个简单的例子中,它应该像

一样
!R = 'b*|[ab][ab]+'

如何调用这样的正则表达式?我从学习中得知,有一种方法可以计算出来,但这种方法很复杂,而且通常很难手工制作。是否有一个很好的在线工具(或常规软件)来做到这一点?

2 个答案:

答案 0 :(得分:3)

如果您正在搜索所有内容,那么正则表达式的某些软件/语言可以取消内置的匹配。例如,使用grep,您可以使用'-v'选项来获取不包含的内容t匹配和我见过的SQL变体允许你使用'not'限定符来否定匹配。

一些/大多数/所有正则表达式方言支持的另一个选择是使用“负向前瞻”。您可能需要查找特定的语法,但这是一个非常值得一读的有趣工具。通常它是这样的:if R='<regex>',然后是Negative_of_R='(?!<regex>)'。不幸的是,它可能因语言的特殊性而异(例如vim使用\(<regex>\)\@!)。

提醒一句:如果你不小心,否定的正则表达式会比你期望的更多。如果你有This doesn't match 'mystring'.文字并搜索(?!mystring),那么它将匹配除mystring中的'm'之外的所有内容。

答案 1 :(得分:3)

jbo5112的回答给出了很好的实际帮助。然而,在理论方面:正则表达式对应于常规语言,因此您正在寻找的术语是互补的。

补充正则表达式:

  1. 转换为等效的NFA。这是well-known and defined process.
  2. 通过powerset construction
  3. 将NFA转换为DFA
  4. 通过接受状态不接受来补充DFA,反之亦然。
  5. Convert the DFA正则表达式。
  6. 您现在拥有原始正则表达式的补充!