美文网首页
正则表达式 - 匹配 IP 地址

正则表达式 - 匹配 IP 地址

作者: 简了个书1993 | 来源:发表于2018-05-31 14:56 被阅读9443次
    17220161221160719

    IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
    IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。


    摘自:百度百科[1]



    IP地址格式

    IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位
    用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。
    // 0.0.0.0 ~ 255.255.255.255
    



    根据规则:每段相同,范围都在 0 ~ 255
    0~255 对应的正则表达式为 ` 2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2} `

    下面简单介绍它的组成 ` 2(5[0-5]{1}|[0-4]\d{1}) ` 和 ` [0-1]?\d{1,2} `

    一:` 2(5[0-5]{1}|[0-4]\d{1}) `
    
    1.  5[0-5]{1}    # 匹配:50 ~ 55
    2.  [0-4]\d{1}   # 匹配:0 ~ 49
    
    那么完整的 ` 2(5[0-5]{1}|[0-4]\d{1}) ` 匹配的就是 200 ~ 255
    
    二:` [0-1]?\d{1,2} ` 
    它匹配的是 0 ~ 199
    
    所以整段表达式匹配的就是 0 ~ 255
    



    0 到 255 的式子已经写出来了,那么一共四段再加上中间的点就很容易了

    最终版
    
    (2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})
    
    其实是可以再简化的,重复 `点和数字` 三次就可以了
    
    (2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}
    
    

    下边是各种语言的程序代码:(使用“在线工具[2]”生成)

    js

    var pattern = /(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}/g,
        str = '';
    console.log(pattern.test(str));
    

    php

    $str = '';
    $isMatched = preg_match_all('/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}/', $str, $matches);
    var_dump($isMatched, $matches);
    

    go

    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        str := "test"
        matched, err := regexp.MatchString("(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}", str)
        fmt.Println(matched, err)
    }
    

    rb

    pattern = /(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}/
    str = ''
    p pattern.match(str)
    

    python2

    import re
    pattern = re.compile(ur'(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}')
    str = u''
    print pattern.search(str)
    

    python3

    import re
    pattern = re.compile(r'(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}')
    str = ''
    print(pattern.search(str))
    

    java

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexMatches {
        
        public static void main(String args[]) {
            String str = "";
            String pattern = "(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}";
    
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(str);
            System.out.println(m.matches());
        }
    
    }
    

    objc

    NSString *str = @"";
    NSString *pattern = @"(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}";
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: pattern options:nil error:&error];
    NSArray *match = [regex matchesInString:str options:NSMatchingCompleted range:NSMakeRange(0, [str length])];
    if (match.count != 0) {
        // ...
    }
    



    经过大量数据测试,均可完美匹配,例如:001.001.001.001 依然是OK的,如有问题敬请指出,会第一时间回复

    请尊重原创,转载注明出处

    参考资料:
    [1] 百度百科 - IP地址
    [2] 在线工具 - 正则测试工具

    相关文章

      网友评论

          本文标题:正则表达式 - 匹配 IP 地址

          本文链接:https://www.haomeiwen.com/subject/nhrqsftx.html