JavaScript RegEx与非捕获组表现出令人眼花缭乱的行为
JavaScript RegEx with non-capturing group exhibiting bewildering behavior
我的问题很简单。 感谢上帝,因为正则表达式可能很复杂......
我在 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');
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- Regex代码只允许一个空格
- Regex匹配除“”之外的所有字符;.js”;
- RegExp:匹配Javascript中除regex值之外的所有内容
- Javascript RegEx validator
- 使用regex的jquery keydown绑定不会验证撇号和句点
- 制作一个regex来验证只有一个数字的字符串
- RegEx JavaScript:数字后的符号提取
- PHP和Javascript之间的Regex差异
- 链接和youtube的Javascript和regex
- 包含圆括号的JavaScript Regex模式
- 相当复杂的Regex
- 如何在ng regex中包含qutoes+双引号
- 在javascript中,I'我很难弄清楚如何让regex只替换捕获而不替换匹配
- Regex提取URL返回数组的一部分;未定义”;
- 将po-box javascript正则表达式转换为c#regex
- Datatables查询url字符串:需要regex来修复url解析
- 要替换的Javascript Regex无法按预期工作
- 如果匹配项在特定的html标记中,则跳过regex匹配
- JavaScript RegEx与非捕获组表现出令人眼花缭乱的行为