Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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 - Fatal编程技术网

JavaScript正则表达式,非捕获组表现出令人困惑的行为

JavaScript正则表达式,非捕获组表现出令人困惑的行为,javascript,regex,Javascript,Regex,我的问题很简单。感谢上帝,因为正则表达式可能很复杂 我在url中有一个查询参数,由?id=0061ecp6cf0q给出 我想匹配它,但只捕获等号后面的部分 我有一个这样的正则表达式: (?:\?id=){1}([a-z0-9])+ 在JavaScript中,当我有一个包含查询参数的字符串,并使用上面的正则表达式构造的正则表达式对象对其执行.match()时,返回一个长度为1的数组,其条目为:“?id=0061ecp6cf0q” 当我使用查询字符串作为参数对正则表达式执行.exec()时,返回一

我的问题很简单。感谢上帝,因为正则表达式可能很复杂

我在url中有一个查询参数,由
?id=0061ecp6cf0q
给出

我想匹配它,但只捕获等号后面的部分

我有一个这样的正则表达式:

(?:\?id=){1}([a-z0-9])+
在JavaScript中,当我有一个包含查询参数的字符串,并使用上面的正则表达式构造的正则表达式对象对其执行.match()时,返回一个长度为1的数组,其条目为:“?id=0061ecp6cf0q”

当我使用查询字符串作为参数对正则表达式执行.exec()时,返回一个长度为2的数组:

array[0] = "?id=0061ecp6cf0q"
array[1] = "q"
1) 为什么我的非捕获组似乎正在捕获?
2) 为什么“q”会被捕获?

您的非捕获组没有捕获。数组的第0个元素始终是完整值。如果只想捕获值,则必须在要捕获的内容周围加上括号:

> /(?:\?id=){1}([a-z0-9]+)/.exec('?id=0061ecp6cf0q')
["?id=0061ecp6cf0q", "0061ecp6cf0q"]
编辑:


您在
([a-z0-9])
周围加上括号,它将匹配一个字符(在本例中为q),而不是整个内容,包括
+

匹配所有字母数字字符的+要在捕获组中

(?:\?id=){1}([a-z0-9]+)
有几件事

我的正则表达式应该是这样的:

(?:\?id=){1}([a-z0-9]+)
最后一个“+”在捕获组的内部!!这就解释了为什么它要捕捉“q”。string.prototype.match没有像我认为的那样工作,是因为我在做

new RegExp("(?:\\?id=){1}([a-z0-9]+)", "g")
“g”标志(全局)显然阻止它返回捕获组数组,而只返回匹配项。如果没有“g”标志,它的行为类似于RegExp.prototype.exec

复制自:

您不需要jQuery来实现这一目的。您可以只使用一些纯JavaScript:

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
用法:

var prodId = getParameterByName('prodId');

可能值得一看这个答案:它有一个方便的实用程序函数,用于按名称获取查询字符串参数