看這個^\s*(_?)(\S+?)\1\s*$從injector.js
正則表達式。這個正則表達式如何匹配組
我已經能夠理解字符串_non_
是如何匹配的。第一個捕獲組由_
組成,第二組由non
組成,第一個捕獲組的結果引用爲_
。所以,第一組是_
,第二組是non
,第三組是_
。
不過,我一直無法理解怎麼串_
,_non
和__
被賦予表達式中的參考\1
這將期待一個_
末,第二組匹配之初給予_
。
看這個^\s*(_?)(\S+?)\1\s*$從injector.js
正則表達式。這個正則表達式如何匹配組
我已經能夠理解字符串_non_
是如何匹配的。第一個捕獲組由_
組成,第二組由non
組成,第一個捕獲組的結果引用爲_
。所以,第一組是_
,第二組是non
,第三組是_
。
不過,我一直無法理解怎麼串_
,_non
和__
被賦予表達式中的參考\1
這將期待一個_
末,第二組匹配之初給予_
。
模式:^\s*(_?)(\S+?)\1\s*$
總體而言,這一模式:
^
開始在字符串的開頭
\s*
匹配0或多個空白字符
(_?)
匹配和捕捉0或1個下劃線(捕獲組1)
(\S+?)
非貪婪匹配和捕捉1個或多個非空白字符(捕獲組2)
\1
匹配什麼是在捕獲組1
\s*
匹配0或多個空白字符
$
線的匹配端/串
主題:_
組1:
組2:_
最初這將第一個捕獲組進行匹配。但是,然後引擎移動到第二個捕獲組,並且期望至少有一個char匹配,所以引擎會回溯並從第一個捕獲組中獲取char,因爲第一個捕獲組中的?
使其成爲可選項,而_
是一個非空間字符。然後,由於最終在捕獲組1中沒有任何內容匹配(因爲必須滿足組2),所以在\1
後向引用中沒有任何匹配。
主題:_non
組1:
組2:_non
最初_
在組1中被匹配,則non
在組2相匹配。則引擎查找一個_
該\1
參考,並沒有,所以發動機回溯和火柴從組1中刪除,並在組匹配它2.
主題:_non_
第1組:_
組2:non
到以前類似的:最初的_
在組1匹配,則non
在組2匹配然後發動機查找一個_
該\1
參考,其匹配,所以第1組保持其_
和組2只是有non
。
主題:__
組1:
組2:__
這是作爲第一示例_
基本上相同。 Initally第一_
在組1匹配然後,第二_
組2匹配然後\1
嘗試以匹配另一個_
自組1得到一個,但是沒有的。但第2組至少需要1字符,但是可以有更多,所以正則表達式引擎備份,並把第1組的比賽進入第2組
主題:_ _
組1:
集團2 :
這將導致不匹配。引擎啓動了把第一_
爲1組,但隨後在把空間組2所以備份失敗,並試圖將第一_
到組2,由於沒有第1組,也沒有\1
到比賽。該空間然後匹配\s*
但隨後匹配在最終的_
上失敗,因爲該模式只在字符串結束之前說空格。
旁註
你問評論:
如果它
_
匹配爲第一組,難道一定要匹配_
在 的\1
.Does\1
它指表達式或 表達式的結果?
它引用結果表達式(實際捕獲的內容),而不是表達式本身。
'_?'表示匹配0或1'_',實際上使'_'可選。正則表達式將首先匹配第一個捕獲的組,但隨後回溯並放棄,因爲您期望第二個捕獲組中至少有一個字符。 –
@CrayonViolent如果它匹配第一組的'_',它必須匹配'\ 1'中的'_'。'\ 1'是指表達式還是表達式的結果? – vamsiampolu
'\ 1'只是對第一個被捕獲組的引用。如果沒有匹配的話,沒有什麼可以參考的。看到我它是如何開始的比賽,但給它 –