如何在Regex中使用lookahead和$提取URL中的无后缀资源名
问题解决说明
原正则失效原因
你当前使用的([^/]+)(?=\..*)正则以及直接加$不生效的原因如下:
- 原正则的正向预查
(?=\..*)没有范围限制,只要匹配位置后任意位置存在.就会触发匹配,因此URL中所有包含.的分段前缀都会被命中,比如域名部分的res-3、cloudinary等内容都会被错误匹配。 - 直接在正则末尾加
$不符合逻辑:$代表字符串结束位置,放在预查外部会要求你匹配到的非/字符串同时满足「后面紧跟.加任意字符」和「处于字符串末尾」两个互斥条件,自然无法匹配到结果。
正确正则写法
调整后的正则如下,可直接命中预期的5oonz9结果:([^/]+)(?=\.[^/]*$)
正则逻辑说明:
[^/]+:匹配连续的非/字符,对应资源名主体部分(?=\.[^/]*$):正向预查规则,要求匹配到的内容后续必须满足:一个.+ 任意数量的非/字符 + 字符串末尾,确保只匹配URL最后一段路径的文件名前缀,不会命中路径中其他带.的分段。
可选简化写法
如果你不需要严格使用正向预查,也可以用更直观的捕获规则:/([^/.]+)\.[^/.]+$
直接捕获最后一段路径中最后一个.之前的非/内容,输出结果和上述正则一致。
内容的提问来源于stack exchange,提问作者AndresSp
相关产品推荐
相关产品推荐

