我的问题非常简单。感谢上帝,因为正则表达式很复杂......
我在网址中有一个查询参数,由?id=0061ecp6cf0q
提供。
我想匹配它,但只有捕获等号后面的部分。
我有一个正则表达式:
(?:\?id=){1}([a-z0-9])+
在JavaScript中,我有一个包含查询参数的字符串,并使用从上面的正则表达式构造的正则表达式对象对其执行.match(),我返回一个长度为1的数组,其中包含以下条目:&# 34;?ID = 0061ecp6cf0q"
当我使用查询字符串作为参数在正则表达式上执行.exec()时,我返回一个长度为2的数组:
array[0] = "?id=0061ecp6cf0q"
array[1] = "q"
1)为什么我的非捕获组似乎正在捕获? 2)为什么" q"所有事情都被捕获了?
答案 0 :(得分:2)
您的非捕获组未捕获。数组的第0个元素始终是完整值。如果您只想捕获值,则必须在您要捕获的内容周围加上括号:
> /(?:\?id=){1}([a-z0-9]+)/.exec('?id=0061ecp6cf0q')
["?id=0061ecp6cf0q", "0061ecp6cf0q"]
修改强>
你将括号括在([a-z0-9])
左右,它将匹配一个字符(在本例中为q),而不是包括+
在内的整个字符。
答案 1 :(得分:0)
匹配所有字母数字字符的+想要在捕获组内。
(?:\?id=){1}([a-z0-9]+)
答案 2 :(得分:0)
一些事情。
原来我的正则表达式看起来像这样:
(?:\?id=){1}([a-z0-9]+)
与决赛" +"在捕获组的内部!!这就解释了为什么它正在捕捉" q"。 string.prototype.match没有像我想的那样工作的原因是因为我在做什么
new RegExp("(?:\\?id=){1}([a-z0-9]+)", "g")
那" g" flag(global)显然阻止它返回捕获组的数组,而只返回匹配项。没有" g"标记它的行为类似于RegExp.prototype.exec http://speakingjs.com/es5/ch19.html#String.prototype.match
答案 3 :(得分:0)
复制自:How can I get query string values in JavaScript?
您不需要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');