【问题标题】:Non-greedy capturing parenthesis非贪婪捕获括号
【发布时间】:2023-04-06 17:20:02
【问题描述】:

我有字符串 mysql://user:pw@host/db?reconnect=true 和以下(不正确的)正则表达式:/^mysql:\/\/(.+):(.+)@(.+)\/(.+)\??.*$/

这些是我得到的匹配项:

["user", "pw", "host", "db?reconnect=true"]

唯一有问题的匹配是"db?reconnect=true",我打算是"db"

我已经为“?”尝试了非贪婪限定符。在“db”之后和最后一个捕获括号之后没有成功。无论如何,最后一个捕获括号似乎都是贪婪的。有没有办法解决这个问题?

干杯!

【问题讨论】:

    标签: javascript regex regex-greedy capturing-group


    【解决方案1】:

    你所有的量词都是贪婪的;您需要添加 ? 以使它们不贪婪。在这种特定情况下,您需要小心,因为如果您不确保它必须单独匹配 GET 查询,非贪婪也会忽略 db 中的 b。这里有两个不错的选择:

    1. 明确非贪婪:/^mysql:\/\/(.+):(.+)@(.+)\/(.+?)(?:\?.*)?$/(您需要将 ? 与 GET 查询的其余部分组合在一起;如果它本身是可选的,非贪婪代码将提前停止,忽略可选的 ?,并且把所有东西都塞进贪婪的比赛中.*)
    2. 贪婪,但将?排除在它愿意匹配的对象之外:/^mysql:\/\/(.+):(.+)@(.+)\/([^?]+)(?:\?.*)?$/ 因为?不能出现在合法的URL中,除非在拆分GET查询时,我们从.+交换到@987654332 @保留一切直到?

    【讨论】:

      【解决方案2】:

      您可以使用否定字符类[^?] 匹配任何除了问号?

      试试这个:

      ^mysql:\/\/(.+?):(.+?)@(.+?)\/([^?]+)
      

      Regex101

      Group 1.    `user`
      Group 2.    `pw`
      Group 3.    `host`
      Group 4.    `db`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2020-03-15
        • 2016-04-14
        • 2022-09-28
        • 2011-08-25
        • 2019-05-19
        • 2021-08-19
        相关资源
        最近更新 更多