贪婪带有javascript中的尾随贪婪Regex

Greedy with a trailing greedy Regex in javascript

本文关键字:贪婪 Regex javascript      更新时间:2023-09-26

我正试图用Javascript从URL(http://a.b.com/?a=123)中的参数列表中获取"a=.*"。

/(.*[&|?])(a=.+?)(&.*)/.exec ("http:/a.b.com/?a=123&b=123")

给了我期望和期望:

["http:/a.b.com/?a=123&b=123", "http:/a.b.com/?", "a=123", "&b=123"]

然而,可能没有下面的"&arg=val",我需要能够搜索可选的尾部"&.*"(因此在第三组的"&aamp;"后面添加"?"。因此:

/(.*[&|?])(a=.+?)(&?.*)/.exec ("http:/a.b.com/?a=123&b=123")

这给了我意想不到的东西:

["http:/a.b.com/?a=123&b=123", "http:/a.b.com/?", "a=1", "23&b=123"]

第二组现在在"="后面只有1个字符,其余两个"23"是第三组的一部分。。

我可能做错了什么?此外,我们也欢迎任何以不同/更好的方式来做这件事的建议。

提前非常感谢!

您有两种可能性:

  • [&?]a=(.+?)(?:&|$)
  • [&?]a=([^&]+)

因此,要么非贪婪地匹配,直到遇到&或字符串末尾,要么贪婪地匹配除&之外的所有字符。

此外,我缩短了regex,并使组只捕获a参数的值,而不捕获a=部分。不需要.*,除非使用^和/或$进行锚定,否则正则表达式不必匹配整个字符串。字符类中的|也是错误的。

测试用例示例:

alert(JSON.stringify(
  /[&?]a=([^&]+)/.exec("http:/a.b.com/?a=123&b=123")
))