RegEx排除特定的字符串常量

116 regex regex-negation

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

Dan*_*ner 139

你必须使用负前瞻断言.

(?!^ABC$)
Run Code Online (Sandbox Code Playgroud)

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

(?!^ABC$)(^.*$)
Run Code Online (Sandbox Code Playgroud)

如果这在您的编辑器中不起作用,请尝试这样做.它被测试在ruby和javascript中工作:

^((?!ABC).)*$
Run Code Online (Sandbox Code Playgroud)

  • 我最近正在帮朋友做一些非常相似的事情.但是,如果字符串在其中的任何位置包含字符串,则他不希望匹配该字符串.所以我写了一个稍微修改过的表达式*(?!.*ABC)^.*$*,这就像一个魅力. (4认同)
  • 如果您正在查找不包含 ABC 的字符串,这将起作用。但这是目标吗?或者目标是匹配除 ABC 之外的每个字符? (3认同)
  • 我发现很清楚 - "除了特定字符串[常量]之外的任何字符串"因此除了ABC本身之外的任何字符串(包括包含ABC的字符串). (3认同)

Gum*_*mbo 7

试试这个正则表达式:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
Run Code Online (Sandbox Code Playgroud)

它描述了三种情况:

  1. 少于三个任意字符
  2. 正好三个字符,同时
    • 第一个不是A,或者
    • 第一个是A但第二个不是B,或者
    • 第一个是A,第二个B但第三个不是C
  3. 超过三个任意字符


Ada*_*ume 6

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

^([^A]|A([^B]|B([^C]|$)|$)|$).*$
Run Code Online (Sandbox Code Playgroud)

也许它可以简化一点。


Ste*_*ham 6

在.NET中,您可以使用分组来发挥自己的优势,如下所示:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

您会注意到:

(ABC)|(.)
Run Code Online (Sandbox Code Playgroud)

将抢走第二组中除ABC以外的所有内容。括号环绕每个组。因此(ABC)是组1,而(。)是组2。

因此,您只需像这样替换第二组:

$2
Run Code Online (Sandbox Code Playgroud)

或在.NET中,查看Regex类内的Groups集合以获得更多控制。

您还应该能够在大多数其他正则表达式实现中执行类似的操作。

更新:我在这里找到了一种更快的方法:http : //regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

它仍然使用分组(我找不到不使用分组的方法)。但是这种方法比第一种快10倍以上。


der*_*ert 5

除非您的regexp引擎对此有特殊支持,否则这并不容易。最简单的方法是使用否定匹配选项,例如:

$var !~ /^foo$/
    or die "too much foo";
Run Code Online (Sandbox Code Playgroud)

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

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

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