2016-09-29 128 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:我认为这可能是这样的... –

相关问题