正则表达式学习

今天想写一个 识别正常域名的 正则表达式,网上搜索了很多,但是没有太合适的,自己手艺又差,只能查了下 正则的原理和规范,自己动手写,看起来特别的可怕,但是写一会就慢慢上手了.
首先我要的域名 开头已经 定了 就是 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)) 这个原理,用 | 自己弄下,加深学习。       

如果有错误,请指出,我会挑我听得懂的改正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值