可能很简单,但我正在尝试从此正则表达式返回捕获组...
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']
但是相反,似乎只能得到一个始终是第一组的结果。
该表达式本身很好,并且已在多种服务中进行了测试,但似乎无法弄清楚为什么它不能按预期工作。
任何帮助将不胜感激。
您必须确保将第二个捕获组内容添加到结果数组中:
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));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句