RegEx使用通配符验证IP地址

时间:2012-07-02 21:49:19

标签: regex validation

我似乎无法获得正确的RegEx来验证IP地址,包括支持通配符char(*),这种情况只能在最后发生。例如:

有效

1.2.*
1.2.3.*
1.2.3.4

无效

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

我已经接近了(在这里发现了一些类似的问题/答案),但无法让所有场景通过/失败。谁能帮我吗? BTW - 验证八位字节是0-255是没有必要的,但会很酷。

6 个答案:

答案 0 :(得分: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]?)\.){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 :(得分:1)

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

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

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

答案 2 :(得分:0)

正则表达式:

\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替换为^(开头)和$(结束),否则将在字符串中查找匹配项

答案 3 :(得分:0)

^(?:(?:[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

答案 4 :(得分:0)

好又短

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

使用正则表达式修饰符,允许^和$匹配行开头/结尾

答案 5 :(得分:0)

全部在一条线上:

^\*|(?: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