2014-10-11 94 views
0

我想从JavaScript中的URL(http:/a.b.com/?a = 123)中的参数列表中获得“a =。*”。在javascript中贪婪与尾随贪婪正则表达式

/(.*[&|?])(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”,我需要能够搜索到一个可选的结尾“&。 *”(所以加上‘&’的第三组后,因此‘?’:

/(.*[&|?])(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”是第三组的一部分。这

我可能是做错了?也欢迎任何建议来做这个不同/更好的方式。

非常感谢!

回答

1

你有两种可能性:

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

所以,要么匹配非贪婪,直到你遇到一个&或字符串的结尾,或匹配贪婪的所有字符除了&

此外,我缩短了您的正则表达式,并使组只捕获a参数的值,而不包含a=部分。 .*不需要,你的正则表达式不需要匹配整个字符串,除非它与^和/或$锚定。而那个|在角色类中也是错误的。

实例与测试用例:

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

+0

我能理解第二个选项,并用它和工作!我不熟悉?: - 所以只需要第二个选项。 (感谢指针? - 将检查出来)。伟大的东西卢卡斯,这是一个轻松的快速反应! – user1055761 2014-10-11 21:48:08

+0

不客气。仅供参考,'(?:...)'相当于'(...)',但它不捕获它的值。它仅用于简单分组。 – 2014-10-11 21:49:59

+0

哦,所以人们也可以[&?] a =(。+?)[&| $] +? – user1055761 2014-10-11 21:54:52