正则表达式可以用来匹配除特定字符串常量(即 "ABC")之外的任何字符串吗?
"ABC"
有没有可能只排除一个特定的字符串常量?
这并不容易,除非 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”。
f
o
fo
您必须使用负面的前瞻性断言。
(?!^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,})$
它描述了三个案例:
A
B
C