关于正则表达式的限定符“+”捕获的问题,为什么只匹配到了最后一个?

发布于 2022-09-12 23:29:40 字数 1044 浏览 21 评论 0

var url = "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe";
var pattern = /https?:\/\/(\w+\.?)+\?(\w+=\w+&?)+#\w+/;
var result = pattern.exec(url);
// [
//   0: "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe",
//   1: "com",
//   2: "test=4",
//   groups: undefined
//   index: 0,
//   input: "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe",
//   length: 3
// ]
console.log(result);

想知道为什么 (\w+\.?) 只匹配到了 com(\w+=\w+&?) 只匹配到了 test=4?

我的预期是:

// [
//   0: "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe",
//   1: "www.",
//   2: "nowcoder.",
//   3: "com",
//   4: "key=1",
//   5: "key=2",
//   6: "key=3",
//   7: "test=4",
//   groups: undefined
//   index: 0,
//   input: "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe",
//   length: 3
// ]

不知道怎么修改正则表达式才能达到我的预期?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪之魂 2022-09-19 23:29:40

这张图可以说明为什么第一个组只匹配到了com, regex

网站链接 https://regexper.com/#%2Fhttp...

如果想取得你需要的结果的话,需要7个匹配组去分别匹配对应项,感觉不如直接分割子字符串后再处理来的方便

/https?:\/\/(\w+\.?)(\w+\.?)(\w+\.?)\?(\w+=\w+)&(\w+=\w+)&(\w+=\w+)&(\w+=\w+)#\w/

补充:
http://www.regular-expression... 这篇文章很好的解释了为什么贪婪匹配组(也就是(\w+\.?)+)为什么只保留了最后的com

木有鱼丸 2022-09-19 23:29:40

因为\w 等价于'[A-Za-z0-9_]'.
(\w+.?)中的.? 表示可以匹配0个.字符,.?表示只匹配0-1个点字符,并且你加了括号,应该这导致了你匹配到了.com

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文