代码之家  ›  专栏  ›  技术社区  ›  Maxime Dupré

非贪婪捕获括号

  •  2
  • Maxime Dupré  · 技术社区  · 7 年前

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

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

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

    我尝试了“db”之后的“?”和最后一个捕获括号之后的非贪婪限定符,但没有成功。不管怎样,最后一个括号似乎是贪婪的。有解决这个问题的办法吗?

    干杯

    2 回复  |  直到 7 年前
        1
  •  2
  •   K.Dᴀᴠɪs    7 年前

    可以使用否定字符类 [^?] 匹配任何东西 除了 ? .

    试试这个:

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

    Regex101

    Group 1.    `user`
    Group 2.    `pw`
    Group 3.    `host`
    Group 4.    `db`
    
        2
  •  2
  •   ShadowRanger    7 年前

    你所有的量词都是贪婪的;您需要添加 ? 让他们不贪婪。在这种特定情况下,您需要小心,因为如果不确保它必须单独匹配GET查询,非贪婪将忽略 b 在里面 db

    1. 显式非贪婪: /^mysql:\/\/(.+):(.+)@(.+)\/(.+?)(?:\?.*)?$/ (您需要将 ? 使用GET查询的其余部分;如果它本身是可选的,那么非贪婪代码将提前停止,忽略可选代码 .* )
    2. ? 从它愿意匹配的东西来看: /^mysql:\/\/(.+):(.+)@(.+)\/([^?]+)(?:\?.*)?$/ ? .+ [^?]+ 把一切都保留到
    推荐文章