【问题标题】:Non-Greedy Single Character Match Regex非贪婪单字符匹配正则表达式
【发布时间】:2012-01-05 00:04:39
【问题描述】:

我正在做这样的非贪婪匹配

'(?<C2>.+?)'

在引号内查找组。这很好用,直到我想做这样的事情

'(?<C2>.+?)' as 

匹配引号中的内容,后跟空格,后跟单词 as。

但是现在,下面的内容将无法匹配

'hello'123'hello2' as

我希望这个完全不匹配......但它最终匹配整个块

'hello'123'hello2' 

作为C2

强制非贪婪的.+? 包含' 的第一次出现,而不是' as 的第一次出现的最佳方法是什么

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以试试;

    '(?<C2>[^']+?)' as 
    

    【讨论】:

      【解决方案2】:

      这似乎有效

      (?<C2>'[^']+')(?= as)
      

      解释

      NODE                     EXPLANATION
      --------------------------------------------------------------------------------
        (?<C2>                   group and capture to C2:
      --------------------------------------------------------------------------------
          '                        '\''
      --------------------------------------------------------------------------------
          [^']+                    any character except: ''' (1 or more
                                   times (matching the most amount
                                   possible))
      --------------------------------------------------------------------------------
          '                        '\''
      --------------------------------------------------------------------------------
        )                        end of \1
      --------------------------------------------------------------------------------
        (?=                      look ahead to see if there is:
      --------------------------------------------------------------------------------
           as                      ' as'
      --------------------------------------------------------------------------------
        )                        end of look-ahead
      

      即使没有前瞻(?= as)(?&lt;C2&gt;'[^']+') 也会按预期以非贪婪的方式匹配引用的字符串。

      【讨论】:

      • 这使得组匹配正确......但我怎样才能让整个正则表达式匹配失败?
      【解决方案3】:

      我认为我对您的问题的理解与迄今为止回答的人不同。由

      强迫非贪婪.+的最佳方法是什么?最多包括第一次出现的 ',而不是第一次出现的 ' 作为

      您的意思是说您想匹配前两个' 之间的单词,即hello,而不是hello2?在这种情况下,这是我的建议:

      '(?<C2>.+?)'(?! as)
      

      否定前瞻将确保您不会匹配as 之前的单词。

      如果我误解了您的要求:对不起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多