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