我有字符串 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/