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

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
// ]

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

阅读 1.7k
2 个回答

这张图可以说明为什么第一个组只匹配到了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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题