162

可以使用正则表达式匹配除特定字符串常量(即"ABC")之外的任何字符串吗?

是否可以只排除一个特定的字符串常量?

4

5 回答 5

186

您必须使用否定的前瞻断言。

(?!^ABC$)

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

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

如果这在您的编辑器中不起作用,请尝试此操作。它经过测试可以在 ruby​​ 和 javascript 中工作:

^((?!ABC).)*$
于 2009-09-08T17:28:40.170 回答
8

在 .NET 中,您可以像这样使用分组来发挥自己的优势:

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

你会注意到:

(ABC)|(.)

将在第二组中获取除 ABC 之外的所有内容。括号围绕每个组。所以 (ABC) 是第 1 组, (.) 是第 2 组。

所以你只需像这样抓住第二组:

$2

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

您也应该能够在大多数其他正则表达式实现中做类似的事情。

更新:我在这里找到了一种更快的方法: http ://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

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

于 2009-09-08T18:33:27.467 回答
7

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

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

如果没有,你必须做一些邪恶的事情:

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

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

于 2009-09-08T17:26:41.437 回答
6

您可以使用负前瞻,或类似的东西:

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

也许它可以简化一点。

于 2009-09-08T17:31:16.017 回答
4

试试这个正则表达式:

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

它描述了三种情况:

  1. 少于三个任意字符
  2. 正好三个字符,而要么
    • 第一个不是A,或者
    • 第一个是A但第二个不是B,或者
    • 第一个是A第二个B但第三个不是C
  3. 三个以上任意字符
于 2009-09-08T21:07:55.233 回答