如何使用正则表达式匹配截止到首个后续斜杠前的所有目标URL
问题分析
你原来写的https://www.domain.tld/service[^/]*存在两个核心问题:
- 没有添加结束锚点,实际只会做前缀匹配,对于
https://www.domain.tld/service/afdsasdaf这类不符合要求的URL,依然能匹配到https://www.domain.tld/service这段前缀,导致误判。 - 域名中的
.没有转义,正则里.默认匹配任意字符,存在误匹配其他相似域名的风险。
正确正则写法
如果是做完整URL校验,推荐使用:
^https://www\.domain\.tld/service(?:/?(?:\?.*)?)$
各部分说明:
^匹配字符串开头,避免匹配到包含该路径的其他长URLhttps://www\.domain\.tld/service匹配固定前缀,.转义为\.保证只匹配字面量点(?:/?(?:\?.*)?)非捕获分组,匹配service后允许的所有合法后缀:/?允许存在0个或1个尾部斜杠(?:\?.*)?允许存在0个或1个查询参数段(即?开头的任意后续内容)
$匹配字符串结尾,保证service后不会出现多余的路径段
匹配效果验证
可匹配的目标URL:
https://www.domain.tld/service?itm_pm=de:ncp:ctr:c1cn:0:0https://www.domain.tld/servicehttps://www.domain.tld/service/
不会匹配的排除URL:
https://www.domain.tld/service/afdsasdafhttps://www.domain.tld/service/afdsasdaf/asdasd
如果你的使用场景是从长文本中提取符合要求的URL,不需要完整匹配整个字符串,可以改用带否定预查的版本:
https://www\.domain\.tld/service(?!/[^?])
内容的提问来源于stack exchange,提问作者Peleke
相关产品推荐
相关产品推荐

