如何排除特定的字符串常量?

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

有没有可能只排除一个特定的字符串常量?

433001 次浏览

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

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

否则,你就得做些邪恶的事情:

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

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

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

(?!^ABC$)

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

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

如果这在你的编辑器中不起作用,试试这个:

^((?!ABC).)*$

你可以使用负面的预测,或者类似这样的东西:

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

也许可以简化一下。

在.NET 中,你可以像下面这样利用分组:

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

你会注意到:

(ABC)|(.)

除了第二组的 ABC,其他的都会拿到。括号围绕每一组。因此(ABC)是第1组和(。)是第二组。

所以你只需要把第二组人换成这样:

$2

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

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

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

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

试试这个正则表达式:

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

它描述了三个案例:

  1. 少于三个任意字符
  2. 正好三个字符
    • 第一个不是 A,或者
    • 第一个是 A,但第二个不是 B,或者
    • 第一个是 A,第二个是 B,但第三个不是 C
  3. 三个以上任意字符