如何修改正则实现仅含一级子目录无参JS文件链接的精准匹配
正则匹配单级子目录下无查询参数JS文件的方案
需求背景
需要编写正则匹配同时满足以下规则的链接:
- 域名后仅存在1级子目录
- 目标资源为文件名长度7个字符及以上的JavaScript文件
.js后缀后不存在?和&字符,即不带任何查询参数
匹配判定示例
(1) https://some.domain.example.tld/randomcharacter/randomfilename.js // 需匹配 (2) https://some.domain.example.tld/randomcharacter/randomfilename.js? // 不匹配 (3) https://some.domain.example.tld/randomcharacter/randomfilename.js?a=b&c=d // 不匹配 (4) https://some.domain.example.tld/subdir/public/lib/randomcharacter/randomfilename.js // 不匹配
注:示例中
tld、randomcharacter、randomfilename均为可变非固定内容
原有正则的问题
当前使用的正则如下:
/\/[a-zA-Z]{7,}\/[a-zA-Z]{7,}\.js$(?!(\?|&))/
该正则可正确排除(2)(3)类带查询参数的场景,但会错误匹配(4)这类域名后有多级路径的链接,不符合要求。问题原因有两个:
- 没有从链接起始位置锚定域名段,只要路径任意位置出现
/任意目录/7位以上文件名.js结尾的片段就会命中,无法限制域名后只有1级子目录 - 写在
$后的负向预查(?!(\?|&))完全无效——$代表字符串已经到末尾,后面不可能存在任何字符,这部分判断是冗余的
修正方案
通用兼容版正则(推荐)
/^https?:\/\/[^/]+\/[^/]+\/[^/]{7,}\.js$/
逻辑拆解
^https?:\/\/[^/]+:从链接起始位置匹配http/https协议,一直匹配到域名结束(第一个路径分隔符/前的所有内容为域名部分)\/[^/]+\/:匹配域名后的第一级子目录,[^/]+代表子目录名可以是除路径分隔符外的任意合法字符,无长度限制[^/]{7,}\.js$:匹配长度7位及以上的文件名,且整个链接以.js结尾,天然排除后缀带查询参数、哈希的场景,不需要额外判断
仅允许字母的严格版正则
如果要求子目录名、文件名只能由英文字母组成,使用以下版本:
/^https?:\/\/[^/]+\/[a-zA-Z]+\/[a-zA-Z]{7,}\.js$/
效果验证
- 对示例(1):域名后仅1级子目录,文件名长度达标,以.js结尾,正常匹配
- 对示例(2)(3):.js后存在查询参数,链接结尾不是.js,直接排除
- 对示例(4):域名后存在多级子目录,路径中分隔符数量不符合规则,无法匹配
内容的提问来源于stack exchange,提问作者Tần Quảng
相关产品推荐
相关产品推荐

