可以使用正则表达式匹配除特定字符串常量(即"ABC"
)之外的任何字符串吗?
是否可以只排除一个特定的字符串常量?
您必须使用否定的前瞻断言。
(?!^ABC$)
例如,您可以使用以下内容。
(?!^ABC$)(^.*$)
如果这在您的编辑器中不起作用,请尝试此操作。它经过测试可以在 ruby 和 javascript 中工作:
^((?!ABC).)*$
在 .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 倍以上。
这并不容易,除非您的正则表达式引擎对它有特殊支持。最简单的方法是使用否定匹配选项,例如:
$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
”。
您可以使用负前瞻,或类似的东西:
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
也许它可以简化一点。
试试这个正则表达式:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
它描述了三种情况:
A
,或者A
但第二个不是B
,或者A
第二个B
但第三个不是C