2015-12-17 103 views
0

我混淆了約一個正則表達式:".*",如果我申請這這樣一句話:we have a problem with "string one" and "string two". Please respond. 它應該像這樣工作:C#正則表達式定義問題

1)首先它應該在句子中找到雙引號

2)然後點選每個文字(沒有換行符)和星號*重複這個模式。所以結果應該是這樣的:

"string one" and "string two". Please respond. 

我覺得.*說完這句話,因爲它包括但換行符的所有文字,是因爲判決是由.*結束,我認爲第二個雙引號未能就判決影響我犯錯了,我不明白它是如何工作的!任何人都可以解釋我的程序?

+0

*是貪婪和吃外話之間的一切。 –

回答

3

你說對了。 .*直到字符串或第一個換行符結束。

然後,它會回溯

請參閱下一個正則表達式標記是必需的"。所以你匹配它的比賽成功。

因此,*「放棄」一個字符,並試圖以匹配"將再次生成的字符串進行:

"string one" and "string two". Please respond 

這種失敗,所以*會放棄另一一個等:

"string one" and "string two". Please respon 
"string one" and "string two". Please respo 
"string one" and "string two". Please resp 
"string one" and "string two". Please res 
... snip ... 
"string one" and "string two". P 
"string one" and "string two". 
"string one" and "string two" 
"string one" and "string two 

啊哈,這串後面緊跟",所以它被消耗,匹配成功的:

"string one" and "string two" 

你可能想嘗試的ungreedy版本:".*?"。在這種情況下,*?將嘗試匹配任何字符(.儘可能少的次數成功匹配。

對於匹配成功,您仍然需要關閉",因此.*?版本將嘗試消耗字符,直到引擎可以在該模式中繼續前進。你會得到的結果將是:

"string one" 
+0

很好的解釋。當我開始學習正則表達式時,我被困在回溯中,無法得到它的工作方式。 –

+0

真的很好的解釋,謝謝+1 – pejman

1

你有第二個「在您的正則表達式所匹配的最後文字」刪除,只使用

".*