可以使用正则表达式来匹配除特定字符串常量之外的任何字符串,让我们说“ABC”吗?这可能只排除一个特定的字符串常量吗?提前谢谢你的帮助。
答案 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,})$
它描述了三种情况:
A
或A
,但第二个不是B
或A
,第二个B
但第三个不是C