2015-01-15 63 views
0

我已經測試這個表達式
(?<=\))(.+?)(?=\()|(?<=\))(.+?)\b|(.+?)(?=\()正則表達式趕上沒有一個字符串()像美國廣播公司3種模式(EF),(EF)ABC和

(EF)ABC(GH),但它不工作像這種模式的字符串(ef)abc(gh)

我收到了這樣的結果"(ef)abc"

但這些正則表達式3 (?<=\))(.+?)(?=\()(?<=\))(.+?)\b(.+?)(?=\() 不要單獨爲"(ef)abc(gh)""(ef)abc""abc(ef)"工作。

任何人都可以告訴我問題在哪裏,或者如何得到預期的結果?

+0

http://stackoverflow.com/questions/611883/regex-how-to-match-everything-except-a-particular-pattern?rq= 1 – nhahtdh

+2

請提供您的預期輸出清晰的例子 – Totem

回答

0

假設你正在尋找從括號中的元素之間的文本匹配,試試這個:

^(?:\(\w*\))?([\w]*)(?:\(\w*\))?$ 

^   - beginning of string 
(?:\(\w*\))? - non-capturing group, match 0 or more alphabetic letters within parens, all optional 
([\w]*)  - capturing group, match 0 or more alphabetic letters 
(?:\(\w*\))? - non-capturing group, match 0 or more alphabetic letters within parens, all optional 
$   - end of string 

您還沒有指定你可能會使用什麼語言,但這裏是在Python的例子:

>>> import re 

>>> string = "(ef)abc(gh)" 
>>> string2 = "(ef)abc" 
>>> string3 = "abc(gh)" 

>>> p = re.compile(r'^(?:\(\w*\))?([\w]*)(?:\(\w*\))?$') 

>>> m = re.search(p, string) 
>>> m2 = re.search(p, string2) 
>>> m3 = re.search(p, string3) 

>>> print m.groups()[0] 
'abc' 
>>> print m2.groups()[0] 
'abc' 
>>> print m3.groups()[0] 
'abc' 
0

您的問題是(.+?)(?=\()匹配 「(EF)美國廣播公司」 中的 「(EF)ABC(GH)」。

這個問題的最簡單的解決方案是更明確的關於你在找什麼。在這種情況下,通過將「任何字符」.與「任何不是括號的字符」[^\(\)]交換。

(?<=\))([^\(\)]+?)(?=\()|(?<=\))([^\(\)]+?)\b|([^\(\)]+?)(?=\() 

的清潔器的正則表達式。將

(?:(?<=^)|(?<=\)))([^\(\)]+)(?:(?=\()|(?=$)) 
相關問題