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

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

唯一有问题的匹配是 "db?reconnect=true" ,我打算将其设为 "db"
我已经为“?”尝试了非贪婪的限定符。在“db”之后和最后一个没有成功的捕获括号之后。似乎最后一个捕获括号无论如何都是贪婪的。甚至有解决方案吗?

干杯!

最佳答案

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

  • 显式非贪婪:/^mysql:\/\/(.+):(.+)@(.+)\/(.+?)(?:\?.*)?$/(您需要将 ? 与 GET 查询的其余部分分组;如果它本身是可选的,则非贪婪代码将提前停止,忽略可选的 ? ,并将所有内容插入贪婪的 .* )
  • 贪婪,但从它愿意匹配的内容中排除 ?: /^mysql:\/\/(.+):(.+)@(.+)\/([^?]+)(?:\?.*)?$/ 由于 ? 不能出现在合法 URL 中,除非拆分 GET 查询,我们从 .+ 交换到 [^?]+ 以保留所有内容,直到 ?
  • 关于javascript - 非贪婪捕获括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53716429/

    10-13 08:21