2011-08-06 85 views
0

我一直在使用正則表達式多年,我讀過幾個教程和參考(emacs正則表達式引用是我的聖經),但我仍然有理解匹配的問題。有豐富的例子,正則表達式匹配有一個很好的綜合教程嗎?任何人都可以給我一個鏈接,我終於可以深刻理解正則表達式匹配嗎?正則表達式匹配教程

示例說明困擾我的問題。

haystack = "[{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four}]" 
pattern = "({.+})" 

結果是:

{one, {one, andahalf}} 
{{two, zero}, two} 
{{threezero}, three} 
{four} 

現在,是什麼呢?貪婪或不真實(它是C#Regexp.Matches)?

爲什麼,鄰爲什麼(nongreedy)結果不是:

{one, {one, andahalf} 
{{two, zero} 
{{threezero} 
{four} 

(匹配第一可能對{})

或(貪婪):

{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four} 

(加工最大可能的一對{})

當然,實際結果正是我所需要的,我很開心該正則表達式讀取我的想法,但我寧願我讀他的想法: - D那麼,有沒有人有正則表達式匹配正確的教程,這將幫助我瞭解這場比賽如何做了什麼?

回答

1

發生這種情況的原因是這些模式被換行符分隔,並且默認情況下,點(在您的正則表達式的.+部分中)與除換行符之外的任何內容匹配。要更改該行爲,請使用RegexOptions.Singleline集編譯正則表達式。

因此,在這場貪婪的比賽中,大括號正確平衡只是一個巧合。

一個很好的正則表達式教程可以在http://www.regular-expressions.info找到。

順便說一句,爲了安全起見,花括號總是應該逃脫(\{\})。 .NET正則表達式引擎碰巧認識到,在這種情況下,它們並不意味着量詞,但其他引擎將無法編譯此正則表達式。

+0

啊,換行。對。謝謝!傻我。而且,謝謝你的提示。 – dijxtra

1

這是一個簡單...閱讀:Mastering Regular Expressions (3rd Edition)

這是手下來,最有用的書我已經在我的生活中讀取。非常清晰,準確無誤地呈現材料。一個有趣和徹底的教程,以深入瞭解NFA正則表達式引擎如何在引擎蓋下工作,以及如何利用這些知識開始精確和有效的正則表達式(幾乎任何任何語言)精心製作

說到正則表達式,有兩種類型的人:那些讀過這本書的人和那些沒有讀過的人。

(你能發現誰通過所有.*點星在他們的表情都沒有的人。)

+0

謝謝,那本書太棒了!我很確定我在買它,謝謝。 – dijxtra