首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非贪婪捕获括号

非贪婪捕获括号
EN

Stack Overflow用户
提问于 2018-12-11 02:15:00
回答 2查看 222关注 0票数 3

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

这些是我得到的火柴:

代码语言:javascript
复制
["user", "pw", "host", "db?reconnect=true"]

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

我已经尝试过非贪婪的资格,为两个"?“在"db“之后和最后一次捕获括号之后,没有成功。似乎最后一次捕获括号是贪婪的,无论如何。有什么解决办法吗?

干杯!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-11 02:26:16

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

  1. 显式非贪婪:/^mysql:\/\/(.+):(.+)@(.+)\/(.+?)(?:\?.*)?$/ (您需要将?与GET查询的其余部分进行分组;如果它本身是可选的,则非贪婪代码将提前停止,忽略可选的?,只需将所有内容放入贪婪的.*上的匹配中)。
  2. 贪婪,但将?排除在它愿意匹配的东西之外:/^mysql:\/\/(.+):(.+)@(.+)\/([^?]+)(?:\?.*)?$/,因为?不能出现在合法的URL中,除非拆分GET查询,所以我们从.+切换到[^?]+,以保存所有东西直到?
票数 2
EN

Stack Overflow用户

发布于 2018-12-11 02:25:10

您可以使用一个否定的字符类[^?]来匹配除问号?以外的任何内容。

试试这个:

代码语言:javascript
复制
^mysql:\/\/(.+?):(.+?)@(.+?)\/([^?]+)

Regex101

代码语言:javascript
复制
Group 1.    `user`
Group 2.    `pw`
Group 3.    `host`
Group 4.    `db`
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53716429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档