【问题标题】:Regex matching multiple negative lookaheads正则表达式匹配多个负前瞻
【发布时间】:2014-11-27 23:30:55
【问题描述】:

我试图匹配一个不以“abc:”或“defg:”开头的字符串(使用 Perl 正则表达式),但我似乎不知道如何。我试过类似的东西

^(?:(?!abc:)|(?!defg:))

【问题讨论】:

  • 要求任何不以 abc 开头的字符串:不以 defg: 开头,即任何字符串

标签: regex perl regex-lookarounds


【解决方案1】:

Lookahead (?=foo)(?!foo) 和lookbehind (?<=foo)(?<!foo) 不使用任何字符。

你可以做多个断言:

^(?!abc:)(?!defg:)

或:

^(?!defg:)(?!abc:)

...顺序没有区别。

【讨论】:

    【解决方案2】:

    尝试这样做:

    ^(?!(?:abc|defg):)
    

    【讨论】:

      【解决方案3】:

      使用这个正则表达式:

      ^(?!abc:|defg:)\s*\w+

      这将根据需要避免以 "abc:""defg:" 开头的行。

      【讨论】:

        【解决方案4】:

        …或者我们可以从原始表达式中删除替换:

        ^(?:(?!abc:)(?!defg:))
        

        【讨论】:

          【解决方案5】:

          你能试试这个吗:

          use strict;
          use warnings;
          use Cwd;
          
          while(<DATA>)
          {
              my $line=$_;
              print $line unless($line=~m/^(abc|defg*)/m);
          }
          
          __DATA__
          ebc this is testing ebc
          dbc this is testing dbc
          defg this is testing defg
          abc this is testing abc
          defg this is testing defg
          

          【讨论】:

            【解决方案6】:
            ^(?:(?!abc:|defg:).)*$
            

            试试这个。请参阅 http://regex101.com/r/hQ9xT1/18 上的演示。

            【讨论】:

            • 前面的\b 是多余的,OP 没有说明后面的任何内容。
            【解决方案7】:

            这将完成任务:

            ^(?!(defg|abc):).*
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-22
              • 1970-01-01
              • 2016-12-08
              • 1970-01-01
              • 2012-04-08
              相关资源
              最近更新 更多