Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式返回引用未填充所有捕获组_Javascript_Regex_Capturing Group - Fatal编程技术网

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

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

奇怪的是,我试图通过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 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,我不得不接受迈克的回答,因为他的回答满足了我的要求,我忘了说我的错,不过还是要感谢你的努力!