【问题标题】:How to exclude a specific string constant? [duplicate]如何排除特定的字符串常量? [复制]
【发布时间】:2010-11-26 13:56:51
【问题描述】:

是否可以使用正则表达式匹配除特定字符串常量(即"ABC")以外的任何字符串?

是否可以只排除一个特定的字符串常量?

【问题讨论】:

  • 您使用的是哪个工具?根据工具的不同,可能有一种方法可以在您的正则表达式之外指定它。例如,grep 支持 -v 选项来反转匹配的含义。
  • 那么您是否希望匹配给定字符串的每个字符,除了它的 ABC 部分?换句话说,“A string with ABC”将匹配“A string with”。

标签: regex regex-negation


【解决方案1】:

您必须使用否定的前瞻断言。

(?!^ABC$)

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

(?!^ABC$)(^.*$)

如果这在您的编辑器中不起作用,请尝试此操作。它经过测试可以在 ruby​​ 和 javascript 中工作:

^((?!ABC).)*$

【讨论】:

  • 如果您要查找不包含 ABC 的字符串,这将起作用。但这是目标吗?或者目标是匹配除 ABC 之外的所有字符?
  • 感谢您指出这一点,您是对的 - 我的建议只避免使用以 ABC 开头的字符串 - 我忘了锚定断言。将纠正这一点。
  • 这仍然与我的想法不同。也许提问者会澄清他们在寻找什么。
  • 我觉得很清楚 - “除特定字符串 [常量] 之外的任何字符串”因此除 ABC 本身之外的任何字符串(包括包含 ABC 的字符串)。
  • 我最近在帮助一个朋友做一些非常相似的事情。但是,如果字符串中的任何位置都包含字符串,他不想匹配该字符串。所以我写了你的表达式 (?!.*ABC)^.*$ 的一个稍微修改过的版本,这就像一个魅力。
【解决方案2】:

试试这个正则表达式:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

描述了三种情况:

  1. 少于三个任意字符
  2. 正好三个字符,而
    • 第一个不是A,或者
    • 第一个是A,但第二个不是B,或者
    • 第一个是A,第二个是B,但第三个不是C
  3. 三个以上任意字符

【讨论】:

    【解决方案3】:

    在 .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】:

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

      $var !~ /^foo$/
          or die "too much foo";
      

      如果没有,你必须做一些坏事:

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

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

      【讨论】:

      • 不允许空字符串f、fo和foo。
      • @Gumbo:它允许空字符串就好了;注意 ($) 是第一个选择,所以 ^$ (空字符串) 被接受。我对其进行了测试,至少在 perl 5.0.10 中接受了空字符串。
      • ...抱歉,当然是 perl 5.10.0!
      【解决方案5】:

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

      ^([^A]|A([^B]|B([^C]|$)|$)|$).*$
      

      也许可以简化一点。

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 2021-03-17
        • 2019-11-11
        • 2018-08-29
        • 2011-11-26
        • 1970-01-01
        • 2020-09-16
        • 2022-12-14
        • 1970-01-01
        相关资源
        最近更新 更多