可能是一些简单但我试图从这个正则表达式返回捕获组...
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']
但相反,似乎只得到一个始终是第一组的结果。
表达式本身很好,并且已经在多个服务中进行了测试,但似乎无法弄清楚为什么这不能按预期工作。
非常感谢任何帮助。
答案 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
和没有全局修饰符的正则表达式来访问捕获组内容。
演示:
var expr = /^\/api(?:\/)?([^\/]+)?\/users\/([^\/]+)$/;
var matches = "/api/v1/users/1".match(expr);
if (matches) {
console.log(matches.slice(1));
}
&#13;