【问题标题】:Greedy with a trailing greedy Regex in javascriptjavascript中带有尾随贪婪正则表达式的贪婪
【发布时间】:2014-10-11 21:38:49
【问题描述】:

我正在尝试从 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"]

第二组现在在“=”之后只有一个字符,其余两个“23”属于第三组。

我可能做错了什么?也欢迎任何建议以不同/更好的方式做到这一点。

提前非常感谢!

【问题讨论】:

    标签: javascript regex regex-greedy


    【解决方案1】:

    你有两种可能:

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

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

    另外,我已经缩短了您的正则表达式,并使该组只捕获 a 参数的值,而没有 a= 部分。不需要.*,您的正则表达式不必匹配整个字符串,除非它以^ 和/或$ 锚定。而且字符类中的|也是错误的。

    测试用例示例:

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

    【讨论】:

    • 我可以理解第二个选项并使用它并且工作!我不熟悉 ?: - 所以只选择第二个选项。 (感谢指针?: - 将检查出来)。伟大的卢卡斯,这是一个闪电般的快速反应!
    • 不客气。仅供参考,(?:...) 等同于(...),只是它没有捕捉到它的价值。它只用于简单的分组。
    • 哦,所以也可以这样做 [&?]a=(.+?)[&|$]+ ?
    • 不,你必须使用(&|$),因为在字符类([...])中,正则表达式元字符失去了它们的特殊含义。所以,[&|$] 的意思是:以下字符之一:&|$ 字面意思。
    • 使用了增强答案中的其他一些内容。我需要获取 URL 的其余部分,因此需要获取“。*”。根据您的建议,我用 ^ 和 $ 将其包裹起来。一切运作良好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多