2011-11-23 75 views
0

我正在做一個非貪婪匹配這樣非貪婪單字符匹配正則表達式

'(?<C2>.+?)' 

找到一個引號內的一組。這種運作良好,直到我想要做這樣的事情

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

以匹配報價後面加一個空格某件事,字如下。

但是現在,根據需要

'hello'123'hello2' as 

我想這不符合在以下所有不匹配......但它結束了整個塊

'hello'123'hello2' 

匹配的C2

什麼給力的非貪婪.+?包括多達'中第一次出現,而不是0第一次出現的最好辦法

回答

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>'[^']+')將在非貪婪的方式匹配帶引號的字符串。

+0

這使得小組賽正確...但我怎樣才能使整個正則表達式匹配失敗? – Jeff

2

你可以試試;

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

我想我明白你的問題不同於那些到目前爲止誰作出了答覆。通過

什麼是強制非貪婪的最佳方式。包括多達作爲

你的意思是說你想前兩個'之間的匹配字「並不是第一次出現的」中第一次出現,即hello,不hello2?在這種情況下,這是我的建議:

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

負先行將確保你不會匹配as之前其自帶的單詞。

在情況下,我誤解你的要求:對不起。