在javascript中贪婪贪婪的正则表达式贪婪

时间:2014-10-11 21:38:49

标签: javascript regex regex-greedy

我试图从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”并且我需要能够搜索可选的尾随“&。*”(因此在'&'之后添加'?'第三组。因此:

/(.*[&|?])(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 个答案:

答案 0 :(得分:1)

您有两种可能性:

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

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

此外,我缩短了您的正则表达式,并使该组仅捕获a参数的值,而不是a=部分。不需要.*,您的正则表达式不必与整个字符串匹配,除非它与^和/或$相关联。而且角色类中的|也是错误的。

测试用例示例:

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