V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
joyoner
V2EX  ›  问与答

请懂正则表达式的电工进来帮个忙

  •  
  •   joyoner · 2014-08-21 22:21:30 +08:00 · 3787 次点击
    这是一个创建于 3747 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:匹配公网地址。即除以下地址外,均为公网地址。
    1、10.*.*.*
    2、172.16~31.*.*
    3、192.168.*.*

    写三条即可,但最好写在一条正则式里。
    17 条回复    2014-08-22 11:08:40 +08:00
    Automan
        1
    Automan  
       2014-08-21 22:32:18 +08:00   ❤️ 1
    '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)'
    joyoner
        2
    joyoner  
    OP
       2014-08-21 22:42:01 +08:00
    @Automan 感谢。为了能使匹配的更准确,*能用类似\d{1,3}来表示么。

    我在线测试了一下,发现匹配结果不是太理想。

    http://tool.chinaz.com/regex
    jsonline
        3
    jsonline  
       2014-08-21 22:45:19 +08:00 via Android
    不用正则也可以啊
    xcv58
        4
    xcv58  
       2014-08-21 23:21:21 +08:00 via Android
    我觉得先用正则匹配出所有的 IP 地址,然后再判断是否是公网地址比较好。
    qq529633582
        5
    qq529633582  
       2014-08-21 23:27:14 +08:00
    匹配公网地址 != 排除私网地址
    LZ列出的三个IP段是 http://tools.ietf.org/html/rfc1918#section-3 中的Private Address,还需要排除127.0.0.0/8等特殊IP(见 http://tools.ietf.org/html/rfc5735)
    yinheli
        6
    yinheli  
       2014-08-21 23:39:34 +08:00
    yinheli
        7
    yinheli  
       2014-08-21 23:40:36 +08:00   ❤️ 1
    zyxfsky
        8
    zyxfsky  
       2014-08-22 00:24:50 +08:00   ❤️ 1
    ^\d{1,3}(?<!10)(?<!(172|192))\.\d{1,3}\.\d{1,3}\.\d{1,3}

    好像越想越复杂了,复杂的断言写不来了,断言前面不是172后,同时断言后面不是16-31不知道怎么写,同等高手,求学习
    joyoner
        9
    joyoner  
    OP
       2014-08-22 00:28:50 +08:00 via iPhone
    @yinheli 这个是正向的,也就是匹配的是私网地址。要来个类似非∧的东东。
    chunyang
        10
    chunyang  
       2014-08-22 03:26:54 +08:00
    @yinheli gist 的显示有问题,显然应该在下面加个滚动条的。
    ToughGuy
        11
    ToughGuy  
       2014-08-22 09:57:36 +08:00   ❤️ 1
    ^(?!((127|10)\.\d{1,3}|192\.168|172\.16))\d{1,3}(\.\d{1,3}){3}
    ToughGuy
        12
    ToughGuy  
       2014-08-22 09:59:12 +08:00
    [root@test ~]# cat ip
    115.239.211.110
    127.0.0.1
    192.168.1.1
    10.10.16.1
    172.16.1.1
    199.71.213.22
    [root@test ~]# grep -P '^(?!((127|10)\.\d{1,3}|192\.168|172\.16))\d{1,3}(\.\d{1,3}){3}' ip
    115.239.211.110
    199.71.213.22
    zodiac1111
        13
    zodiac1111  
       2014-08-22 09:59:42 +08:00
    gist突兀有点吓人
    66450146
        14
    66450146  
       2014-08-22 10:03:07 +08:00 via Android
    @Livid gist 在手机上会超出楼层宽度
    zyxfsky
        15
    zyxfsky  
       2014-08-22 11:04:35 +08:00   ❤️ 1
    刚又测试了下,看看这个能否满足你,我测试是ok的

    ^(?!10\.)\d{1,3}\.(?(?<=172\.)(?!(1[6-9]|2[0-9]|3[0-1])\.))(?(?<=192\.)(?!168\.))\d{1,3}(\.\d{1,3}){2}$
    joyoner
        16
    joyoner  
    OP
       2014-08-22 11:07:22 +08:00 via iPhone
    @ToughGuy 172.16~172.31,这个范没有体现。
    joyoner
        17
    joyoner  
    OP
       2014-08-22 11:08:40 +08:00 via iPhone
    @zyxfsky 哈,多谢小峰。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.