Javascript 正则表达式反向引用未填充所有捕获组

标签 javascript regex capturing-group

这里很奇怪(或者可能不是),我试图通过Javascript正则表达式检索两个捕获组,第一组:一个或多个数字(0-9),第二组:一个或多个单词字符或连字符(A-Z, 0-9,-) 但由于某种原因我永远无法检索后一组。

请注意:我特意包含了交替 (|) 字符,因为我希望可能收到其中之一

这是我正在使用的代码:

var subject = '#/34/test-data'
var myregexp = /#\/(\d+)|\/([\w-]+)/;
var match = myregexp.exec(subject);
if (match != null && match.length > 1) {
  console.log(match[1]); // returns '34' successfully
  console.log(match[2]); // undefined? should return 'test-data'
}

有趣的是,Regex Buddy 告诉我,我确实有两个捕获组,并且实际上在测试短语上正确地突出显示了它们。

这是我的 JavaScript 语法有问题吗?

最佳答案

如果你改变:

var myregexp = /#\/(\d+)|\/([\w-]+)/;

通过将 | 交替元字符删除为:

var myregexp = /#\/(\d+)\/([\w-]+)/;

然后它将匹配两个组。目前,您的正则表达式正在寻找 \d+[\w-]+,因此一旦它与第一组匹配,它就会停止,第二组将为空。如果删除 |,它会查找 \d+,后跟 /,然后是 [\w-]+所以它总是匹配两者或都不匹配。

编辑: 要匹配所有 #/34/test-data#/test-data#/34,您可以使用 #(?:\/(\d+))?\/([\w-]+) 代替。

关于Javascript 正则表达式反向引用未填充所有捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7720544/

相关文章:

php - 如何使用 php 或 javascript 编写一个函数来确定 16 位整数的人口数?

javascript - 使用 JavaScript 忽略 "a"、 "the"等的字符串搜索

regex - 正则表达式 : repeating groups only getting last group

ios - NSRegularExpression 找不到捕获组匹配项

javascript - jQuery 自定义选择方法仅适用于集合的第一个元素

java - 正则表达式和捕获括号

regex - 从类似 JSON 的数据中删除 ": "

Python re.sub() 不会替换所有匹配项

java - REGEX:从被许多可选组包围的特定组获取信息

javascript - 将 yyyy-mm-dd 转换为数组中的 unix 时间戳,并在转换后将其放回同一位置。 [Javascript]