0

这里很奇怪(或者可能不是),我试图通过 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 语法中的问题吗?

4

2 回答 2

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)。

于 2011-10-11T01:43:19.003 回答
1

如果你改变:

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

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

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

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

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

于 2011-10-11T01:44:01.013 回答