2014-10-11 119 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