【问题标题】:RegEx to validate ip address with wildcardRegEx 使用通配符验证 IP 地址
【发布时间】:2012-07-03 08:08:45
【问题描述】:

我似乎无法获得用于验证 IP 地址的正确正则表达式,包括对通配符 (*) 的支持,该通配符 (*) 只能在末尾出现。例如:

有效

1.2.*
1.2.3.*
1.2.3.4

无效

1
1.2
1.2*
1.2.3
1.2.3*
1.*.3.4

我已经接近(并在这里找到了一些类似的问题/答案),但无法让所有场景都通过/失败。谁能帮我吗?顺便说一句 - 验证八位位组是 0-255 不是必需的,但会很酷。

【问题讨论】:

  • 你为什么不发布你最好的,最接近的尝试?
  • 那么*1.* 应该通过还是失败?

标签: regex validation


【解决方案1】:

类似这样的:

^((((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}\*)|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}\*)|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1}\*))$

第二版:

^((((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1,3}\*))$

【讨论】:

  • 看起来很不错,但不是每张都需要三个数字吗? (我认为 {1,3} 被警告了。)
  • 不,事实证明你已经成功了。有趣的是,您开发了正则表达式,但后来认为您错了!至少在 regexpal.com 中它可以工作。
  • 效果很好。太感谢了。我在正则表达式的要求中搞砸了。我忘了说“1.*”应该是无效的,并且至少指定了 2 个八位字节。无法弄清楚如何修改它以支持它。那里有最后一点帮助吗?提前谢谢你。欣赏!
  • ^((((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2,3}\*))$
  • 不满足操作请求。例如,1.1.* 不适用于此正则表达式。
【解决方案2】:

全部在一条线上:

^\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\.(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\.(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\.(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})))))))$

分解:

^\*|                                           # Treat '*' by itself as valid or
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\.       # Basic octet pattern plus...
(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\. # Wildcard, or 2nd octet plus...
(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}\. # Wildcard, or 3rd octet plus...
(?:\*|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2}   # Wildcard or last octet
)))))))$                                       # Close up shop

【讨论】:

  • 这个正则表达式效果最好。
【解决方案3】:

最多匹配 3 个部分,然后是通配符或常规 IP:

^((\d{1,3}\.){1,3}\*|(\d{1,3}\.){3}\d{1,3})$

或者,如果您还想验证数字,请将 \d{1,3}s 更改为 (1?\d?\d|2[0-4]\d|25[0-5])

【讨论】:

  • 这看起来不错,但是你需要把除了锚点之外的所有东西都放在一个组中或者在|旁边添加锚点,否则它的意思是“匹配字符串开头的通配符IP或结尾的常规IP字符串”。
  • @F.J:哎呀,你是对的。它经历了一些变化,我错过了:) 谢谢。
  • 1.1.* 不适用于此正则表达式
  • @user3335999: /^((\d{1,3}\.){1,3}\*|(\d{1,3}\.){3}\d{1,3})$/.test('1.1.*') === true
【解决方案4】:

正则表达式:

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

如果您将整个字符串验证为 IP 地址,则将 \b 替换为 ^(开始)和 $(结束),否则它将在字符串中查找匹配项。

【讨论】:

    【解决方案5】:
    ^(?:(?:[0-1]\d\d|2[0-4]\d|25[0-5])|(?:\d{1,2}))(?:(?:(?:\.(?:(?:[0-1]\d\d|2[0-4]\d|25[0-5])|(?:\d{1,2})))){3}|(?:\.(?:(?:[0-1]\d\d|2[0-4]\d|25[0-5])|(?:\d{1,2}))){0,2}\.\*)$
    

    这是一个简短的 ruby​​ 脚本,用于显示构造和验证结果:

    #!/usr/bin/env ruby
    
    octet2 = /(?:\d{1,2})/
    octet3 = /(?:[0-1]\d\d|2[0-4]\d|25[0-5])/
    octet = /(?:#{octet3}|#{octet2})/
    dot_octet = /(?:\.#{octet})/
    
    trailing_wild_ip = /^#{octet}(?:(?:#{dot_octet}){3}|#{dot_octet}{0,2}\.\*)$/
    
    %w{
    1.2.*
    1.2.3.*
    1.2.3.4
    1
    1.2
    1.2*
    1.2.3
    1.2.3*
    1.*.3.4
    }.
      map {|ip| [ip, ip.match(trailing_wild_ip) ? 'valid' : 'invalid' ] }.
      each {|ip,match| puts "#{ip} => #{match}" }
    
    
    # output:
    1.2.* => valid
    1.2.3.* => valid
    1.2.3.4 => valid
    1 => invalid
    1.2 => invalid
    1.2* => invalid
    1.2.3 => invalid
    1.2.3* => invalid
    1.*.3.4 => invalid
    

    【讨论】:

    • @burning_LEGION 没错,我编辑了更严格的八位字节匹配。
    • 1.1.* 不匹配
    【解决方案6】:

    又好又短

    ^((\d+\.){3}\d+|(\d+\.){1,3}\*)$
    

    使用正则表达式修饰符,让 ^ 和 $ 在行开始/结束处匹配

    【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2012-07-01
    • 2020-06-08
    • 1970-01-01
    • 2021-01-03
    • 2014-05-13
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多