3

我不知道它是怎么称呼的:否定、互补或倒置。这个概念是这样的。例如有字母“ab”

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

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

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

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

4

2 回答 2

4

jbo5112 的回答提供了很好的实际帮助。但是,在理论上:正则表达式对应于正则语言,因此您正在寻找的术语是补充。

要补充正则表达式:

  1. 转换为等效的 NFA。这是一个众所周知的定义过程。
  2. 通过powerset 构造将 NFA 转换为 DFA
  3. 通过使接受状态不接受来补充 DFA,反之亦然。
  4. 将 DFA 转换为正则表达式。

您现在有了原始正则表达式的补码!

于 2013-06-11T23:48:01.313 回答
3

如果您所做的只是搜索,那么一些用于正则表达式的软件/语言可以否定内置的匹配。例如,使用 grep 您可以使用“-v”选项来获取不匹配的行和我见过的 SQL 变体允许您使用“非”限定符来否定匹配。

一些/大多数/所有正则表达式方言支持的另一个选项是使用“负前瞻”。您可能需要查看您的特定语法,但它是一个有趣的工具,非常值得一读。通常它是这样的:如果R='<regex>',那么Negative_of_R='(?!<regex>)'。不幸的是,它会随着你的语言特性而变化(例如 vim 使用\(<regex>\)\@!)。

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

于 2012-09-19T05:59:56.223 回答