2015-10-14 119 views
0

在rererence到這個問題後:https://softwareengineering.stackexchange.com/questions/291273/why-regex-when-using-global-search-and-0-quantifier-match-the-end-of-the-stRegular expression to match a line that doesn't contain a word?正則表達式 - 文檔之前空字符串和字符

空字符串的前和後的每個字母是未知的,我的解釋。我第一次聽到這個。我還能在哪裏讀到它,因爲我現在有點困惑,無法找到任何其他來源。

+1

http://www.regular-expressions.info/ – hjpotter92

+0

這並不是說有「空字符串前,每個字母后」。你的查詢的答案在你連接的問題的答案中...... _「你的正則表達式匹配'''空字符串與'd *',因爲'*'量詞意味着零次或多次,這是零'd'這裏。「_ – msanford

回答

4

在匹配正則表達式時,解釋器首先嚐試匹配字符串中的索引0。

  • 如果沒有匹配,則前進到下一個索引並再次嘗試。
  • 如果有匹配,則返回該匹配,然後在匹配結束時嘗試再次匹配。如果最後一個匹配符與空字符串匹配,則前進到下一個字符。

依此類推,對於每個匹配(匹配時)或每個字符(當沒有匹配時)。

正則表達式d*中的問題是它接受空匹配 - 它表示空字符串匹配模式。這意味着你會總是獲得一場比賽。

讓我們嘗試在dddxdddd字符串d*模式:

這裏的初始位置:

dddxdddd  matches: [] 
^ 

^真的意味着光標第一d之前。你應該將光標看作是之間的這兩個字符串。這將幫助您瞭解匹配過程。

所以讓我們只需要插入虛構空間來說明:

d d d x d d d d  matches: [] 
^ 

我們拿到的第一場比賽在這裏,作爲第一個字符是一個d

dddxdddd 
\_/ 

比賽結束後,我們將在光標位於dx之間:

d d d x d d d d  matches: ["ddd"] 
    ^

我們嘗試再次匹配。該匹配成功與dx之間的空字符串。當我們得到一個空的比賽,我們提前光標:

d d d x d d d d  matches: ["ddd", ""] 
     ^

我們然後嘗試再次匹配,而我們得到的dddd子:

dddxdddd 
    \__/ 

我們將光標後:

d d d x d d d d  matches: ["ddd", "", "dddd"] 
       ^

所以它現在在最後的d和字符串的末尾之間。同樣,我們嘗試的比賽,我們有一個空字符串成功:

d d d x d d d d  matches: ["ddd", "", "dddd", ""] 
       ^

如果我們試圖向前移動光標,現在將過去的字符串的結尾,這意味着我們已經找到了所有的比賽,我們完成了。

最終結果:

["ddd", "", "dddd", ""] 
+0

它終於有道理。謝謝你的例子,以及bulleted points .. :-) – airnet

相關問題