RegEx排除一个特定的string常量
可以使用正则expression式来匹配除特定string常量以外的任何string让我们说“ABC”? 这可能只排除一个特定的string常量? 提前感谢您的帮助。
你必须使用负面的前瞻断言。
(?!^ABC$)
你可以例如使用以下。
(?!^ABC$)(^.*$)
如果这在你的编辑器中不起作用,试试这个。 它被testing在ruby和JavaScript工作:
^((?!ABC).)*$
这并不容易,除非你的正则expression式引擎对它有特殊的支持。 最简单的方法是使用否定匹配选项,例如:
$var !~ /^foo$/ or die "too much foo";
如果不是,你必须做一些邪恶的事情:
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/ or die "too much foo";
那个基本上是说“如果它以非f
开始,其余的可以是任何东西;如果它以f
开头,其余的可以是任何东西;否则,如果它开始fo
,下一个字符最好不是另一个o
“。
你可以使用负面的lookahead,或类似的东西:
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
也许它可以简化一点。
在.NET中,你可以像这样使用分组:
http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31
你会注意到:
(ABC)|(.)
除了ABC第二组之外,会抓住所有的东西。 括号包围每个组。 所以(ABC)是组1,(。)是组2。
所以你只需像这样在第二组中取代:
$2
或者在.NET中查看Regex类中的Groups集合,以获得更多的控制权。
你应该可以在大多数其他正则expression式中做类似的事情。
更新:我发现了一个更快的方法来做到这一点: http : //regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03
它仍然使用分组(我找不到一个不使用分组的方式)。 但是这个方法比第一个快了10倍以上。
试试这个正则expression式:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
它描述了三种情况:
- 不足三个任意性格
- 正好三个字符,而任一
- 第一个不是
A
,或者 - 第一个是
A
但是第二个不是B
或者 - 第一个是
A
,第二个B
但是第三个不是C
- 第一个不是
- 超过三个任意字符