RegEx排除一个特定的string常量

可以使用正则expression式来匹配除特定string常量以外的任何string让我们说“ABC”? 这可能只排除一个特定的string常量? 提前感谢您的帮助。

你必须使用负面的前瞻断言。

(?!^ABC$) 

你可以例如使用以下。

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

如果这在你的编辑器中不起作用,试试这个。 它被testing在ruby和JavaScript工作:

 ^((?!ABC).)*$ 

这并不容易,除非你的正则expression式引擎对它有特殊的支持。 最简单的方法是使用否定匹配选项,例如:

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

如果不是,你必须做一些邪恶的事情:

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

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

你可以使用负面的lookahead,或类似的东西:

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

也许它可以简化一点。

在.NET中,你可以像这样使用分组:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

你会注意到:

 (ABC)|(.) 

除了ABC第二组之外,会抓住所有的东西。 括号包围每个组。 所以(ABC)是组1,(。)是组2。

所以你只需像这样在第二组中取代:

 $2 

或者在.NET中查看Regex类中的Groups集合,以获得更多的控制权。

你应该可以在大多数其他正则expression式中做类似的事情。

更新:我发现了一个更快的方法来做到这一点: http : //regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

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

试试这个正则expression式:

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

它描述了三种情况:

  1. 不足三个任意性格
  2. 正好三个字符,而任一
    • 第一个不是A ,或者
    • 第一个是A但是第二个不是B或者
    • 第一个是A ,第二个B但是第三个不是C
  3. 超过三个任意字符