能否将检测两种子域名URL格式的正则表达式合并为一个?
合并子域名检测正则的方案
当然可以!你完全能把这两个正则合并成一个,利用正则的分支匹配(|)特性就能搞定,而且咱们还能做些小优化让表达式更简洁好用。
合并后的正则表达式
直接上代码,两种写法任选:
// 构造函数写法 var combinedRegex = new RegExp(/^([a-z]+:\/\/)?([\w-]+\.[\w-]+(?:\.\w+|\:\w+))$/); // 字面量写法(更推荐,更直观) const combinedRegex = /^([a-z]+:\/\/)?([\w-]+\.[\w-]+(?:\.\w+|\:\w+))$/;
为啥这么写?拆解给你看
咱们把这个合并后的正则拆解开,你就懂了:
^([a-z]+:\/\/)?:和你原来的逻辑一样,匹配可选的协议前缀(比如http://),?表示这个前缀可有可无[\w-]+\.[\w-]+:先匹配子域名的前半段(比如abc.mydomain或者abc.localhost)(?:\.\w+|\:\w+):这是合并的核心!用非捕获分组(?:...)把两种后缀规则包起来:\.\w+:对应你第一种格式的域名后缀(比如.com)|\:\w+:对应你第二种格式的端口后缀(比如:44880)
$:确保整个字符串都匹配,防止出现部分匹配的无效情况
测试一下你的示例域名
用你给的两个域名验证,结果完全符合预期:
var domain_1 = "abc.mydomain.com"; var domain_2 = "abc.localhost:44880"; let result1 = !!domain_1.match(combinedRegex); // 返回 true let result2 = !!domain_2.match(combinedRegex); // 返回 true
额外的小优化
如果你的端口只会是数字(通常端口都是数字),可以把端口部分的\w+改成\d+,这样匹配更精准:
const optimizedRegex = /^([a-z]+:\/\/)?([\w-]+\.[\w-]+(?:\.\w+|\:\d+))$/;
这样就不会把带字母的端口误判成有效格式啦。
内容的提问来源于stack exchange,提问作者Steven Sann
相关产品推荐
相关产品推荐

