正则提取URL第三个/后内容时非捕获组仍显示是什么原因?
问题根本原因
你对非捕获组的作用存在误解:
非捕获组(?:)的核心作用只是不将该分组的内容单独存入捕获组的结果列表,并不会让这部分内容从「正则表达式的整体匹配结果」中剔除。你编写的(?://.+)/.+逻辑上会匹配从//开头到URL末尾的所有字符,自然会把域名、端口部分也包含在最终的匹配结果中。
同时你原来的正则还存在贪婪匹配的问题:.+默认是贪婪模式,会尽可能多匹配字符,会吞掉第三个/之前的所有内容,即使后续调整分组也会导致匹配结果不符合预期。
正确实现方案
方案1:捕获组提取目标内容
将需要的路径部分单独放到捕获组中,正则表达式可写为:^https?://[^/]+(/.*)$
直接提取第1个捕获组的内容,即可得到你预期的/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png结果。
方案2:零宽断言直接匹配目标内容
如果希望正则的整体匹配结果直接就是目标路径,不需要额外取捕获组,可以使用正向后顾断言:(?<=^https?://[^/]+)/.*
该断言只会校验前面是否符合协议://域名端口的格式,不会将这部分内容计入匹配结果,返回的匹配值就是你要的路径部分。
内容的提问来源于stack exchange,提问作者fall
相关产品推荐
相关产品推荐

