2013-04-28 49 views
1

我試圖用一個正則表達式匹配以下兩個字符串類型:需要一些幫助破譯正則表達式

Name(p0, p1,...pN) 

和:

Name() 

我目前使用的常規表情:

@"[a-z]+\([^()]+\)" 

我能理解:

[a-z]  = Match any character from a to z 

我不太肯定的:

[^()]  ?= Match any character between '(' and ')' 

我認爲它屬於被表示爲group

\([^()]+\) 

但同樣,我不能肯定。

目前的表達將努力爲:

Name(p0, p1,...pN) 

,但我不能讓它匹配時,有括號之間沒有逗號分隔的字符。那就是:

Name() 

爲什麼第二個表達式失敗?

編輯:

從你的答案我已經確定了以下內容(請糾正我,如果錯了):

  +   = ONE or more times 
     *   = ZERO or more times 
     []   = Groups characters to match or ignore 
     ^   = Logical NOT 

     [a-z]+  = Match a lowercase letter (ONE or more times) 
     \(   = Match the character '(' 
     [^()]*  = Match anything that's NOT '(' or ')' (ZERO or more times) 
     \)   = Match the character ')' 
+0

你有沒有考慮閱讀基本的正則表達式介紹? – phant0m 2013-04-28 20:46:36

+1

@ phant0m得到這個很遠,我很確定他已經讀了一個基本的介紹。正則表達式看起來有點神祕,這個論壇的重點是能夠提出有關這樣的事情的問題。 – 2013-04-28 20:50:08

+0

從突然涌入的答案中,我可以獲得更多。感謝所有發佈的人! – user1423893 2013-04-28 21:00:03

回答

5
[a-z]+  = Match any character from a to z, 1 or more times 
\(   = Match "(" literally 
[^()]+  = Match anything that's NOT "(" or ")", 1 or more times 
\)   = Match ")" literally 

像比利Moon說,用*代替在第三個「部分」 +匹配0次或更多次,而不是1次以上「括號內的非括號」。

括號不構成一個組 - 它們被轉義爲「\」。

3

使用*而不是+接近尾聲...

@"[a-z]+\([^()]*\)" 

[^()]+部分表示否定匹配類([^...]),如不在括號內(())或更多次(+)。但是,您希望它是零次或多次(*),以便即使在沒有元素時也能匹配。

+4

您可能想要添加一個*解釋*,該問題需要提供; * – phant0m 2013-04-28 20:45:44

1

我不太肯定的:^()]

這是一個字符類,意思是「未嘗不是一個(或)」 這是一個有點貪心。 (真的取決於你的要求,允許換行等。)

我認爲它屬於記一組:)(

這將是一個組,如果它沒有被反斜槓轉義。像這樣,它會告訴正則表達式尋找大括號。

我建議是這樣的:

@"[A-Za-z]+\(([\w,. ])*\)" 

如果...你原來的例子僅僅是這個問題的縮短版,與實際數據中包含不點,你可能會刪除點從角色類也是如此。

+0

+1,關於'[^()]'可能過度貪婪的評論 - 即將添加到我的答案中。 – JimmiTh 2013-04-28 20:55:07

4

這裏是你表達的解釋:不是在一開始^性格改變了它的含義是「獨家」:

[a-z]+\([^()]+\) 
^^^^^^ 
    | | | | | | 
    | | | | | +-- The closing parenthesis 
    | | | | +---- Repeated one or more time 
    | | | +------- Any character other than '(' or ')' 
    | | +---------- The opening parenthesis 
    | +------------ Repeated one or more time 
    +--------------- A lowercase letter 

,你有錯的是[^()]子表達式的唯一部分「包括」字符類的其餘字符。

如果要匹配一對空括號,請用+替換爲*以將含義從「一個或多個」更改爲「任意數字,包括零」。

+0

我見過的最清晰的正則表達式解釋 – Jonesopolis 2013-04-29 03:35:19