2015-06-05 57 views
3

看這個^\s*(_?)(\S+?)\1\s*$injector.js正則表達式。這個正則表達式如何匹配組

我已經能夠理解字符串_non_是如何匹配的。第一個捕獲組由_組成,第二組由non組成,第一個捕獲組的結果引用爲_。所以,第一組是_,第二組是non,第三組是_

不過,我一直無法理解怎麼串__non__被賦予表達式中的參考\1這將期待一個_末,第二組匹配之初給予_

+0

'_?'表示匹配0或1'_',實際上使'_'可選。正則表達式將首先匹配第一個捕獲的組,但隨後回溯並放棄,因爲您期望第二個捕獲組中至少有一個字符。 –

+0

@CrayonViolent如果它匹配第一組的'_',它必須匹配'\ 1'中的'_'。'\ 1'是指表達式還是表達式的結果? – vamsiampolu

+0

'\ 1'只是對第一個被捕獲組的引用。如果沒有匹配的話,沒有什麼可以參考的。看到我它是如何開始的比賽,但給它 –

回答

5

模式:^\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它指表達式或 表達式的結果?

它引用結果表達式(實際捕獲的內容),而不是表達式本身。