如何编写正则捕获符合year_max参数条件的URL域名?
原有正则的问题
- 分支逻辑错误:你写的
(?:&year_max=2019|2020|2021|2022)?的实际匹配逻辑是「匹配&year_max=2019,或匹配单独的2020/2021/2022字符串」,没有把四个年份都绑定到year_max参数上。 - 贪婪匹配问题:
.*会优先吞噬尽可能多的字符,导致后面的可选参数匹配逻辑完全失效,即使year_max是不合法年份也会被.*吞掉从而错误匹配成功。
修正后的正则
^(domain\.com)\/[^&]*(?:&(?!year_max=)[^&]*)*(?:&year_max=(?:2019|2020|2021|2022))?$
匹配逻辑说明
^匹配字符串开头,避免部分内容匹配(domain\.com)捕获你需要的域名分组\/[^&]*匹配域名后的路径、首个参数前缀(不含&分隔符的部分)(?:&(?!year_max=)[^&]*)*匹配所有非year_max开头的其他参数,确保所有前置参数都被正确跳过(?:&year_max=(?:2019|2020|2021|2022))?可选匹配末尾的year_max参数,仅当值为指定四个年份时生效,符合你要求的「year_max如果存在就是最后一个匹配参数」的规则
测试验证
对给出的三个URL匹配结果如下:
domain.com/search.action?zip=94558&year_max=2020:匹配成功,捕获domain.comdomain.com/search.action?zip=94558&year_max=2017:匹配失败domain.com/search.action?zip=94558:匹配成功,捕获domain.com
内容的提问来源于stack exchange,提问作者Rajat
相关产品推荐
相关产品推荐

