2016-09-29 118 views
2

我很好奇爲什麼以下RegEx匹配返回兩次相同的匹配。爲什麼這個Javascript RegExp返回兩次相同的匹配?

var line = "APT5000* A 00001"; 
var matches = line.match(new RegExp("^(.{3})", "i")); 
console.log('Number of matches: %d', matches.length); 
console.log('matches[0]: %s', matches[0]); 
console.log('matches[1]: %s', matches[1]); 

結果如下輸出:

Number of matches: 2 
matches[0]: APT 
matches[1]: APT 

我本來預期,而不是隻有一個匹配。

各種資源在線表明這是預期行爲,第一個結果始終是「完整匹配」,然後是特定匹配。

我的問題只是這個......「爲什麼?這種行爲背後的邏輯是什麼?」

+1

試試這個:'new RegExp(「^(。{3})。{3}(。{3})」,「i」)''。你看到發生了什麼? – dasblinkenlight

+0

*捕獲組和反向引用是正則表達式的一些更有趣的功能。你在子表達式中放置一個子表達式,你可以用'\ 1'或'$ 1' *來獲取捕獲。並且'\ 0','$ 0'或ECMAScript特定的'$&'返回完整匹配。 – revo

回答

10

對不起,我錯過了你說你知道以下所有內容的問題。

我的問題只是這個......「爲什麼?這種行爲背後的邏輯是什麼?

另一種方法是要求您使用嵌套捕獲組,如果您想獲得整體匹配以及其中的部件。

嵌套的捕捉組使表達更加複雜。所以我猜他們很簡單。我不能馬上想到我用過的一個正則表達式引擎,它的工作方式與JS的工作方式不同(在這方面),它可以爲您提供整體匹配和捕獲組。


原來的答覆已經錯過了一個點位(遺憾):

匹配陣列中的第一個條目總是整體匹配。隨後是任何捕獲組中匹配的內容。就你而言,你的整個表情是一個很大的捕捉組,所以你會看到同樣的事情兩次。

如果你不需要捕獲組,只是離開了()

var line = "APT5000* A 00001"; 
 
var matches = line.match(new RegExp("^.{3}", "i")); 
 
console.log('Number of matches: %d', matches.length); 
 
console.log('matches[0]: %s', matches[0]); 
 
if (matches.length > 1) { 
 
    console.log('matches[1]: %s', matches[1]); 
 
}

邊注:除非您有特定需要使用new RegExp(string),它幾乎總是更好地使用正則表達式文字

var matches = line.match(/^.{3}/i); 
+0

感謝您的深思。 最後一點,我確實需要使用RegExp構造函數,因爲表達式實際上來自用戶定義的配置文件。 – ra9r

+0

@raiglstorfer:我認爲這可能是這樣的... –

相關問題