我似乎无法获得正确的正则表达式来验证 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 不是必需的,但会很酷。
我似乎无法获得正确的正则表达式来验证 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 不是必需的,但会很酷。
像这样的东西:
^((((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}\*))$
全部在一条线上:
^\*|(?: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 个部分,然后是通配符或常规 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])
。
正则表达式:
\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
为^
(开始)和$
(结束),否则它将在字符串中查找匹配项。
^(?:(?:[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
又好又短
^((\d+\.){3}\d+|(\d+\.){1,3}\*)$
使用正则表达式修饰符,让 ^ 和 $ 在行开始/结束处匹配