2016-02-28 60 views
2

enter image description here約迴歸正則表達式

大家好。我有個問題。

在第6級,爲什麼要回到'Welco'?

我認爲回到'歡呼'在6級是正確的。

已經在第4級使用'Welcom'了嗎?

英語寫作是非常困難的。:)

回答

2

[a-z]\w+\S\B模式不是一個好模式。爲什麼?因爲相鄰的子模式可以相互匹配。這就是爲什麼在這種基本子模式的短輸入中有3個回溯步驟。

現在,一旦你明白子模式的作用,一切都會變得清晰。

步驟1:我們發現字符串中的空白位置(正則表達式引擎檢查輸入字符串中的每個位置)。

步驟2[a-z]第一個字符W匹配(因爲該模式是不區分大小寫的

步驟3:自該\w+匹配elcome是文本的單詞字符塊被添加所有這些字符。到匹配值(Welcome已經在這一點!但還是有子模式,試圖匹配。因此,正則表達式引擎繼續努力工作。)

步驟4:正則表達式引擎試圖容納\S(非空白)子模式的一些文本。它回溯,即產生最後一個字符來測試它是否可以與\S子模式相匹配。

第5步:最後的e符合要求。現在我們在比賽中仍然有Welcome,但最後的e「屬於」子模式\S

步驟6e\S匹配後面沒有與非字邊界(如\B不會在字符串的末尾匹配,如果最後一個字符是一個字符)。這個事實使e\S子模式的匹配無效。因此,正則表達式引擎必須再次回溯以重新適應\S子模式的值。 e不能與\S匹配,因此回溯到m。這就是爲什麼步驟6中的正則表達式正好在o之後。

步驟7\S可以匹配m,所以現在m 「屬於」 \S子模式。

步驟8\Bme之間的位置匹配。繼續。

第9步:達到模式結束。匹配值返回:Welcom

+1

整個測試字符串是'歡迎來到我的世界!'。我想匹配'世界!'只要。我現在知道了。非常感謝你!祝你有美好的一天〜:) –

1

+是貪婪的,它嘗試匹配一切。所以一旦\w+匹配整個輸入,引擎會嘗試匹配\S並失敗,所以它會回退並嘗試與之前的\w+相匹配。它繼續這樣做直到找到(或不是)匹配。

+0

我很好奇爲什麼在6級中回退兩步。謝謝。 –