正则表达式需求:匹配特定域名格式,修复现有正则失效场景
域名匹配正则表达式修正方案
需求说明
需要匹配以下三类域名格式:
- 任意
*.扩展名(扩展名需包含2个及以上a-z字符) - 任意
domain.扩展名或多级子域名格式(如sub.domain.扩展名) - 以上两类中以
*.开头的字符串(即*.扩展名和*.多级域名.扩展名)
现有正则问题
- 原正则
/^(?:\*\.)?([a-z0-9-]{1,255}\.)+[a-z]{2,}$/i无法匹配*.test:该正则要求*.后必须至少有一个带.的域名段,而*.test中*.后直接是扩展名,不符合结构要求。 - 修改后的正则
/^((?:\*\.)?([a-z0-9-]{1,255}\.)+[a-z]{2,})|\*.[a-z]{2,}$/i会误匹配*.*.test:分支匹配优先级导致只要字符串包含*.扩展名片段就会被判定匹配,忽略了中间非法的*字符。
修正后的正则表达式
/^(?=.*\.)(?:\*\.)?(?:[a-z0-9-]{1,255}\.)*[a-z]{2,}$/i
正则逻辑说明
(?=.*\.):正向预查,确保字符串至少包含一个.,排除纯字符串(如test)和以.开头的非法格式(如.test)。(?:\*\.)?:可选的*.前缀,支持以*.开头的格式。(?:[a-z0-9-]{1,255}\.)*:0个或多个合法域名段(由字母、数字、连字符组成,长度1-255)加.,既适配*.test无额外域名段的场景,也支持*.test.test或test.test的多级域名结构。[a-z]{2,}:匹配至少2个字符的扩展名,满足需求对扩展名的长度要求。/i:忽略大小写,支持匹配大小写混合的域名。
测试用例验证
| 测试字符串 | 匹配结果 |
|---|---|
test | false |
.test | false |
*.test | true |
test.test | true |
*.test.test | true |
*.*.test | false |
内容的提问来源于stack exchange,提问作者user756659
相关产品推荐
相关产品推荐

