JavaScript RegEx与非捕获组表现出令人眼花缭乱的行为

JavaScript RegEx with non-capturing group exhibiting bewildering behavior

本文关键字:眼花缭乱 RegEx JavaScript      更新时间:2023-09-26

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

我在 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.exechttp://speakingjs.com/es5/ch19.html#String.prototype.match

复制自: 如何在 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');