2013-01-03 37 views
1

我有一個關於以下的正則表達式的一個問題:nodejs正則表達式 - 爲什麼我們需要「?」在下面的正則表達式

match = /^([^[]+?)(\[.*\])?$/.exec(path); 

我不理解的行爲「?」在第一個表達式:

^([^[]+?) 

我的意思是,如果這種表達是一個獨立的正則表達式和路徑是「ABC [高清]」,我會得到:「一」爲比賽[1],對不對? (由於懶惰匹配)。 現在,當我添加第二個表達式時,match [1]是:「abc」。 你能解釋一下這個區別嗎?

感謝, 李

如果使用
+1

@SamIam這是不正確的 – bukart

回答

1

+?*?建築的?導致它之前在一個非貪婪,或懶惰,時尚的行爲操作。這意味着它將消耗盡可能少的字符,而不是儘可能多(因爲是默認值)。

但是,在這個特定的正則表達式中,沒有任何字符串爲?更改行爲。

/^([^[]+?)(\[.*\])?$/ 

由於第一組([^[]+?)必須遵循由字符串的任一末端或[和第一組不能包含[,它將匹配整個字符串(如果它沒有[)或者達到第一個[,或者根本不匹配。所以在這種情況下,+的貪婪是無關緊要的。

+0

明白了。謝謝 :) – user429400

2

?你實際上是在說,

  • 可能會或可能不會

  • lazy匹配

ab?我小號a帶或不帶b(僅一次)

但在這種格式:

a+?是:「嘗試搜索的,但不貪」,因此只有第[一]在

[aaaaaaa]將在這裏匹配。

編輯

/^([^[]+?)/.exec("abc[def]"); //["a", "a"] 

這是爲什麼?

監守你正在尋找

從一開始

----一切不包括[但搜索分鐘出現次數。

那你a

但當youre做

/^([^[]+?)(\[.*\])?$/.exec("abc[def]"); 

的其中一個congusing你的是:在secong組

.*

+0

是的,所以如果路徑是「abc [def]」,爲什麼我得到「abc」作爲match [1]而不是「a」? – user429400

+0

@ user429400是什麼讓你認爲你只會匹配'a'? –

+0

當我嘗試這個表達式時:/ ^([^ [] +?)/和這個路徑:「abs [def]」它只匹配「a」(我正在用節點控制檯測試它) – user429400

2

+之後的?將正則表達式引擎的行爲交換爲不合格。默認情況下,引擎會嘗試匹配可用的最大字符串。尾隨?它試圖獲得最短。

更多信息,請點擊這裏:http://www.regular-expressions.info/repeat.html

+0

是的,但似乎第二個表達式以某種方式改變了這種行爲...... – user429400

+0

第二個表達式'(\ [。* \])?'在字符串的末尾匹配類似「[stuff here]」的任何東西。這個地方的'?'可以讓這個東西最多出現一次。 – bukart

+0

好的,我理解了第二個表達式。確實它匹配了第一個「[」和最後一個「]」之間的所有內容。我不明白「?」是什麼意思在第一個表達式中。我認爲這應該意味着:匹配0或1個不是「[」的字符。事實證明它不會改變任何東西,它似乎沒有任何影響。 – user429400

相關問題