• 正则匹配IP


    分析

    IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255( 2^8 ),段与段之间用英文句点“.”隔开。例如:某台计算机IP地址为10.11.44.100。

    IP地址的组成特点:250-255、200-249、0-199。 

    分别考虑
    这三种情况可以分开考虑, 
    1. 250-255:特点:三位数,百位是2,十位是5,个位是0~5,用正则表达式可以写成:25[0-5] 
    2. 200-249:特点:三位数,百位是2,十位是0~4,个位是0~9,用正则表达式可以写成:2[0-4]d 
    3.  0-199:这个可以继续分拆,这样写起来更加简单明了. 
         0-9:    特点:一位数,个位是0~9,用正则表达式可以写成:d 
         10-99:  特点:二位数,十位是1~9,个位是0~9,用正则表达式可以写成:[1-9]d 
         100-199:特点:三位数,百位是1,十位是0~9,个位是0~9,用正则表达式可以写成:1d{2}

     

    再组合

    于是0-99的正则表达式可以合写为[1-9]?d

    那么0-199用正则表达式就可以写成(1d{2})|([1-9]?d)

    这样0~255的正则表达式就可以写成(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))

    最后,前面3段加上句点.可以使用{3}重复得到,第4段再来一次同样的匹配,得到IP地址的正则表达式:

    ((?:(?:25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(?:25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))))

     

    注意: 

    1.  为什么三位数的匹配放在二位数/一位数的前面?

    因为正则表达式规则之一:最先开始的匹配拥有最高的优先权。

    2.  0.0.0.0和255.255.255.255是合法存在的IP地址,你知道是为什么吗?

    注意这两个IP地址也可以匹配,要单独过滤。

    4.  为什么前面在最前面要有?:呢?它在这里有什么用?

    ?:是不捕获分组的意思,就是()中的内容本来可以在后边用1,2等代替,现在不能了。同时在匹配出的完整代码中也不包含分组。( 详细看?<:哪一篇的解释 )

    
    

    正则表达式验证工具,The Regulator 下载地址:http://sourceforge.net/projects/regulator/

     
  • 相关阅读:
    CSS 3 中的多列属性
    CSS3 3D转换
    CC3中的2D转换
    ubuntu sudo: pip:找不到命令
    ubuntu 下更新pip后发生 ImportError: cannot import name 'main'的问题解决
    ubuntu 安装pip
    gradle下载
    L0,L1,L2正则化浅析
    安装使用离线版本的维基百科(Wikipedia)
    Linux中CPU亲和性(affinity)
  • 原文地址:https://www.cnblogs.com/leezhxing/p/4333769.html
Copyright © 2020-2023  润新知