Javascript正则表达式返回引用未填充所有捕获组
奇怪的是,我试图通过Javascript正则表达式检索两个捕获组,第一组:一个或多个数字(0-9),第二组:一个或多个单词字符或连字符(A-Z,0-9,-),但由于某种原因,我永远无法检索后一组 请注意:我有意加入了替换(Javascript正则表达式返回引用未填充所有捕获组,javascript,regex,capturing-group,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);
|
)字符,因为我希望可能接收其中一个字符)
这是我正在使用的代码:
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 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中删除或操作数,可以同时得到两个结果…(类似于AND)。如果更改:
var myregexp = /#\/(\d+)|\/([\w-]+)/;
通过删除|
交替元字符,只需:
var myregexp = /#\/(\d+)\/([\w-]+)/;
然后它将匹配两个组。目前,您的正则表达式正在查找\d+
或[\w-]+
,因此,一旦它与第一组匹配,它将停止,第二组将为空。如果删除|
,它将查找\d+
,然后是/
,然后是[\w-]+
,因此它将始终同时匹配或不匹配
编辑:
要匹配所有
#/34/测试数据
、#/测试数据
或#/34
,您可以使用#(?:\/(\d+))\/([\w-]+)
对不起,我应该提到,我想匹配#/test data
或#/34
这就是为什么会有交替字符,我该怎么做?哦,我想我刚刚有了一个想法,我可以使用你的版本,但是将+
更改为*
以匹配0或多次!太棒了,谢谢。效果很好。可能也比我的想法要好:)只是想让你知道我在这方面有点进步,只是为了让捕获组保持在正确的索引位置。这就是我决定的:#((?:/(\d+))(?:/([\w-]+)?
它将在第1组和第2组中分别保持#/34
和#/test data
,然后在第1组和第2组中保持匹配。请查看我写给mike的回复,我实际上需要or测试。嗨,Deleteman,我不得不接受迈克的回答,因为他的回答满足了我的要求,我忘了说我的错,不过还是要感谢你的努力!