今天想写一个 识别正常域名的 正则表达式,网上搜索了很多,但是没有太合适的,自己手艺又差,只能查了下 正则的原理和规范,自己动手写,看起来特别的可怕,但是写一会就慢慢上手了.
首先我要的域名 开头已经 定了 就是 http 和 https 的,最大到二级域名,
结尾就是 com 或 cn, 可能会有端口.
我的想象就是:
http(s)://(www.)(xxx.)xxx.com/cn(:8080)
括号内是可能存在的
/ 左右是平级的可选值
我首先要解决的就是 http开头的 正则判断
let str="被检测的字符串";
let reg=/^http(s)?:$/;
console.log(reg.test(str));
解释:
这可能是个固定的套路 正则的样子就是这样的 /正则主体/
^ shift+6 这个符号 是表示开始的,我是这么理解的.
$ shift+4 这个符号 是表示结束的,我是这么理解的.
http 就是 匹配 http 这几个字
(s)? ?号是个量词 表示 0-1 次出现,就是没有或者只有一个都可以。(x==0||x==1)
: 就是匹配 : 号
这样看起来就很通顺了
接着下来 我要判断 域名部分了,我只是针对了常见的 英文和数字的域名,中文域名我没有那个需求。
let str="被检测的字符串";
let reg=/^(www.)?([a-zA-Z0-9]+.)?([a-zA-Z0-9]+.)(com|cn)(:[0-9]{1,4})?$/;
console.log(reg.test(str));
解释:
这个就要用到最初的需求理解了。
(www.)(xxx.)xxx.com/cn(:8080)
最简单的是 xxx.com/cn
最全的是 www.xx.xxx.com/cn:8080
很多项是可能有的,这就需要我们多写点 ? 来拼凑了。
(www.)? 可能有 www. 这串字符
([a-zA-Z0-9]+.)? 这个是二级域名,也是可能有的
([a-zA-Z0-9]+.) 这个必须有了 这个是域名主体,它包括 小写字母,大写字母,数字,
"-" 符号 是范围 [] 符号 是个条件框 + 号是个 量词,表示 至少出现一次 (x>=1)
这就是说,前面至少一个 a-z,A-Z,0-9 中的元素,而且后面带个 "." 符号
(com|cn) 这个得有 域名后缀 我只需要 这个两个,就这么写,如果大家需要的不是很多,也可以写上 (com|cn|org|xxx)
(:[0-9]{1,4})? 端口可能出现,所以也有问号,我知道的端口就是冒号+数字,所以 首先得有 ":" 号,
[0-9] 就是 限定的元素 是0-9的数字,{n,m} 这个是声明次数的 这个意思就是说 前面的元素,
出现 大于等于1次,小于等于4次 就是限定成了 0-9999的正整数。{} 符号还可以单独用,
{n} 要么0 要么 n 相当于 ? 号 的1 可以自己设定了。
{n,} 大于等于n 相当于 + 号 的1 可以自己设定了。
至此我觉得我自己完成了,把之前的都拼在一起
let str="被检测的字符串";
let reg=/http(s)?:(www.)?([a-zA-Z0-9]+.)([a-zA-Z0-9]+.)?(com|cn)(:[0-9]{1,4})?$/;
console.log(reg.test(str));
各种测试
当我准备装B的时候,发现各问题,有个同事给了我个 url 是他本地的 http:192.168.1.125:8070,是他的项目访问地址,我就日了,我忘记了还有这种 url,但是没事,我的需求不包含这种,但是我还是想试试,于是开始了一段2b的测试。
按照之前的理解,重点在 ip 格式上,0-255 的数字+”.” 号 (http(s):)xxx.xxx.xxx.xxx(:8080)
我当时就写了个自己觉得很简单的判断 :
let reg=/^((http|https):)?[0-255]{3}[0-255](:[0-9]{1,4})?$/;
这就是个错误~!!!! 没法这么用 原因是什么我也不知道,反正就是[0-255] 白扯~!
那就重新分析,0-255 那就是说 我不能一下子全设定上,只能单个字符去写 正则,那分析下,要正则一个数字是否是在0-255
除了[0-255] 以外还能怎么写 先看200多的情况 :
255-200 第一位2 第二位最大5,最小0,第三位讨厌了,第二位是5的时候,是5-0,其他的时候是 9-0,最后总结:
25[0-5],2[0-4][0-9] 就这样就可以了
199-100 第一位1 第二位 9-0 第三位 9-0 这个好
1[0-9]{2}
99-0 这个稍微注意下, 不要出现 01,09 这样的东东,所以必须是 要么2位数,要们1位数,这样就需要 ? 来帮助了
[1-9]?[0-9]
let reg=/^((http|https):)?((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))(:[0-9]{1,4})?$/;
到此应该不需要多余的讲解了,这个大家稍微看下都会 明白,至于如何把 这个和上面的正则合在一起,懂得瞬间懂,不懂得
参考 if((x=='a' || x==12)) 这个原理,用 | 自己弄下,加深学习。
如果有错误,请指出,我会挑我听得懂的改正。