正则表达式仅返回第一组

时间:2016-08-21 19:14:31

标签: javascript regex

可能是一些简单但我试图从这个正则表达式返回捕获组...

const expression = /^\/api(?:\/)?([^\/]+)?\/users\/([^\/]+)$/g

我用来执行此操作的代码如下......

const matchExpression = (expression, pattern) => {

    let match;
    let matches = [];

    while((match = expression.exec(pattern)) != null) {
         matches.push(match[1]);
    };

    return matches;
};

/api/v1/users/1 ...

匹配时,我期待以下结果
['v1', '1']

但相反,似乎只得到一个始终是第一组的结果。

表达式本身很好,并且已经在多个服务中进行了测试,但似乎无法弄清楚为什么这不能按预期工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您必须确保将第二个捕获组内容添加到结果数组中:

while((match = expression.exec(pattern)) != null) {
     matches.push(match[1]);
     matches.push(match[2]); // <- here
};

由于您匹配整个字符串,因此您可以使用/^\/api(?:\/)?([^\/]+)?\/users\/([^\/]+)$/正则表达式(因为您匹配整个字符串,而不需要g全局修饰符)并将代码缩减为:

const matchExpression = (expression, pattern) => {    
    let matches = pattern.match(expression);
    if (matches) {
        matches = matches.slice(1);
    }
    return matches;
};

关键是你可以使用String#match和没有全局修饰符的正则表达式来访问捕获组内容。

演示:

&#13;
&#13;
var expr = /^\/api(?:\/)?([^\/]+)?\/users\/([^\/]+)$/;
var matches = "/api/v1/users/1".match(expr);
if (matches) {
  console.log(matches.slice(1));           
}
&#13;
&#13;
&#13;