5

我试过这样的一段代码

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

并像这样传递了一个网址"___http://someurl/user/jane"

事实证明 match 被初始化为具有以下元素的数组

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

我本来期望一个元素,即match[0]. 为什么返回第二个字符串 - 它似乎与正则表达式不匹配。

我对 JavaScript 的经验很少,环顾四周后我找不到解释。欣赏对此的解释

谢谢

4

1 回答 1

10

看一下String.match,或者更好,它与没有标志的正则表达式RegExp.exec具有相同的返回值:String.matchg

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

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

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

这将提取整个匹配项(在索引处0)将其返回给变量match,数组的其余部分被丢弃。

注意:如果正则表达式可能不匹配,您应该在提取完整匹配之前测试它是否返回匹配以防止错误:

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

这是一个摆弄的现场演示:jsFiddle

我已经删除了捕获组,因为在这种情况下它不会有所作为。没关系,只是微优化。

您可以在此处阅读有关正则表达式的捕获组/反向引用的更多信息。


¹ 并非总是如此,有一些修饰符使它成为非捕获组 ( ?:)、前瞻、后视等,但这些都是题外话。您可以在上面链接的站点中找到有关这些的更多信息。

于 2013-03-18T21:38:50.673 回答