RegEx排除特定的字符串常量

RegEx to exclude a specific string constant

本问题已经有最佳答案,请猛点这里访问。

正则表达式是否可以用于匹配除特定字符串常量之外的任何字符串,我们称之为"abc"?是否可以只排除一个特定的字符串常量?事先谢谢你的帮助。


您必须使用否定的先行断言。

1
(?!^ABC$)

例如,您可以使用以下内容。

1
(?!^ABC$)(^.*$)

如果这在编辑器中不起作用,请尝试此操作。它在Ruby和Javascript中进行了测试:

1
^((?!ABC).)*$


在.NET中,你可以使用分组来实现你的优势:

http://regexhero.net/tester/?ID=65B32601-2326-4ECE-912B-6DCEFD883F31

你会注意到:

1
(ABC)|(.)

将抓取除ABC以外的所有东西在第二组。括号环绕着每组。所以(abc)是第1组(.)是第2组。

所以你只需要在替换中抓取第二组这样的内容:

1
$2

或者在.NET中,查看regex类内的groups集合以获得更多的控件。

在大多数其他regex实现中,您也应该能够执行类似的操作。

更新:我在这里找到了一个更快的方法:http://regexhero.net/tester/?ID=997CE4A2-878C-41F2-9D28-34E0C5080E03

它仍然使用分组(我找不到不使用分组的方法)。但这种方法比第一种方法快10倍以上。


你可以使用否定的前瞻,或者类似的东西:

1
^([^A]|A([^B]|B([^C]|$)|$)|$).*$

也许它可以简化一点。


这并不容易,除非您的regexp引擎对它有特殊的支持。最简单的方法是使用负匹配选项,例如:

1
2
$var !~ /^foo$/
    or die"too much foo";

如果没有,你必须做些坏事:

1
2
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
    or die"too much foo";

基本上说"如果以非f开头,其余的可以是任何东西;如果以f开头,非o开头,其余的可以是任何东西;否则,如果以fo开头,下一个字符最好不是另一个o"。


尝试此正则表达式:

1
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

它描述了三种情况:

  • 少于三个任意字符
  • 正好是三个字符,而不是
    • 第一个不是A,或
    • 第一个是A,第二个不是B,或者
    • 第一个是A,第二个是B,但第三个不是C
  • 超过三个任意字符