将两个检查 url 的正则表达式合并为一个

Combine two regular expression that check an url into one

这是我用来检查 url 是否为子域的代码。

    var domain_1 = "abc.mydomain.com";
    var domain_2 = "abc.localhost:44880"

    var regex1 = new RegExp(/^([a-z]+\:\/{2})?([\w-]+\.[\w-]+\.\w+)$/);
    var regex2 = new RegExp(/^([a-z]+\:\/{2})?([\w-]+\.[\w-]+\:\w+)$/);
   
    let result1 = !!domain_1.match(regex1);
    let result2 = !!domain_2.match(regex2);

如您所见,第一个子域的格式类似于 ###.###.###(有两个点)第二个是 ###.###:###(带一个点和一个冒号)。
对于这两种格式,我需要两个正则表达式。
我可以合二为一吗?

这对我有用

const domain_1 = "abc.mydomain.com";
const domain_2 = "abc.localhost:44880"

const regex = new RegExp(/^([a-z]+\:\/{2})?([\w-]+\.[\w-]+((\.\w+)|(\:\d+)))$/);
   
const result1 = regex.test(domain_1);
const result2 = regex.test(domain_2);
console.log(result1, result2)

https://www.ocpsoft.org/tutorials/regular-expressions/or-in-regex/

这会处理域名的单个单词 (localhost) 到多个点分隔的单词 (abc.many.subs.mydomain.com),确保没有连续的点,后跟一个可选的端口号(:1234) :

const domains = [
  'abc.mydomain.com',
  'abc.localhost:44880',
  'localhost',
  'abc.many.subs.mydomain.com',
  'abc.my@domain.com',
  'abc.my@domain.com:1234'
];
const regex = /^[a-z_\-]+(\.[a-z_\-]+)*(\:[0-9]+)?$/;
domains.forEach((domain) => {
  var result = regex.test(domain);
  console.log(domain + ' ==> ' + result)
});

控制台输出:

abc.mydomain.com ==> true
abc.localhost:44880 ==> true
localhost ==> true
abc.many.subs.mydomain.com ==> true
abc.my@domain.com ==> false
abc.my@domain.com:1234 ==> false

解释:

  • ^...$ - 在开始和结束处锚定正则表达式
  • [a-z_\-]+ - 以一个或多个允许字符的单词开头
  • (\.[a-z_\-]+)* - 后跟零次或多次出现的点和单词
  • (\:[0-9]+)? - 后跟一个可选的点和至少一个数字