JavaScript RegEx与非捕获组表现出令人困惑的行为

时间:2015-03-09 22:07:26

标签: javascript regex

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

我在网址中有一个查询参数,由?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"所有事情都被捕获了?

4 个答案:

答案 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');