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

时间:2011-10-11 01:39:36

标签: javascript regex capturing-group

奇怪的一个(或许没有),我试图通过Javascript正则表达式检索两个捕获组,第一组:一个或多个数字(0-9),第二组:一个或多个单词字符或连字符(AZ, 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语法中的问题吗?

2 个答案:

答案 0 :(得分:1)

如果删除“|”你得到你想要的结果......这有帮助吗?

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'
}

快乐的编码!

修改

我认为你的问题是,因为你使用的是“|”,你告诉JS要抓住第一组或第二组,因为JS eval是懒惰的,当它找到第一组时,它就停止了那里......通过从RegExp中删除OR操作数,你得到两个结果......(类似于AND)。

答案 1 :(得分:1)

如果你改变:

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

|替换元字符删除为:

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

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

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