非贪心单字符匹配正则表达式

时间:2011-11-23 17:32:11

标签: regex

我正在做一个像这样的非贪婪的比赛

'(?<C2>.+?)'

在引号内找到一个组。这很有效,直到我想做这样的事情

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

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

但是现在,以下内容不符合要求

'hello'123'hello2' as

我希望这根本不匹配......但它最终匹配整个块

'hello'123'hello2' 

C2

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

3 个答案:

答案 0 :(得分:2)

你可以试试;

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

答案 1 :(得分: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)(?<C2>'[^']+')也会按照预期的非贪婪方式匹配引用的字符串。

答案 2 :(得分:0)

我认为我对你的问题的理解与迄今为止回复的人不一样。通过

  

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

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

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

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

如果我误解了您的请求:抱歉。