nodejs request.url.match(regexp)似乎除了匹配之外还返回匹配的一个子string

我试过这样一段代码

var match = req.url.match(/^\/user\/(.+)/) 

并传递一个像这样的"___http://someurl/user/jane"

事实certificate,匹配被初始化为一个具有以下元素的数组

 match[0]='/user/jane' match[1]='jane' 

我会期待一个单一的元素,即match[0]的第一个元素。 为什么第二个string返回 – 它似乎不匹配正则expression式。

我对JavaScript的使用经验很less,有些四处寻找后我找不到解释。 欣赏这个解释

谢谢

看一下String.match ,或者更好的RegExp.exec ,它的返回值与String.match相同,但是不带g标志的正则expression式:

返回的数组具有匹配的文本作为第一个项目,然后匹配的每个捕获括号中的一个项目包含捕获的文本。

也就是说,圆括号¹之间的组成一个俘获组。 如果你只需要完整的匹配,你可以使用:

 var match = req.url.match(/^\/user\/.+/)[0]; console.log(match); //logs: "/user/jane" 

这将提取整个匹配(在索引0 ),将其返回到variablesmatch ,数组的其余部分将被丢弃。

注:如果正则expression式可能不匹配,则应在抽取完整匹配之前testing它是否返回匹配以防止出现错误:

 var match = req.url.match(/^\/user\/.+/); if (match !== null) { match = match[0]; console.log(match); //"/user/jane" } else { console.log("no match"); } 

这里有一个现场演示: jsFiddle

我已经移除了捕获组,因为在这种情况下它不会有所作为。 实际上并不重要,只是一个微观优化。

你可以在这里阅读更多关于正则expression式的捕获组/反向引用。


¹不总是这样,有修饰符使它成为一个非捕获组( ?: :),向前看,向后看等,但这些都是无关紧要的。 你可以在上面链接的网站上find更多关于这些的信息。