我正试图用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")
))