RegEx排除特定的字符串常量

时间:2009-09-08 17:18:56

标签: regex regex-negation

可以使用正则表达式来匹配除特定字符串常量之外的任何字符串,让我们说“ABC”吗?这可能只排除一个特定的字符串常量吗?提前谢谢你的帮助。

5 个答案:

答案 0 :(得分:122)

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

(?!^ABC$)

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

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

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

^((?!ABC).)*$

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分:4)

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

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

也许它可以简化一点。

答案 3 :(得分:4)

在.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倍。

答案 4 :(得分:2)

试试这个正则表达式:

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

它描述了三种情况:

  1. 少于三个任意字符
  2. 正好是三个字符,而其中一个
    • 第一个不是A
    • 第一个是A,但第二个不是B
    • 第一个是A,第二个B但第三个不是C
  3. 超过三个任意字符