如果要精确,仅验证每个八位字节包含三个数字是不够的;您需要验证它是否介于 0 和 255 之间。这导致单个 IP 地址的以下表达式:
\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
要验证掩码,您需要重复表达式。要验证 CIDR 表示法后缀,您需要一个介于 0 和 32 之间的数字:
\/(3[0-2]|[012]?\d)
然后,您需要为逗号分隔的列表重复整个组。将它们放在一起,为清楚起见添加了空格和注释:
# Start of line:
^
(
(
# An IP address:
\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
# Optionally followed by either:
(
# a CIDR suffix:
(\/(3[0-2]|[012]?\d))
|
# or a subnet mask:
;\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
)?
)
# Followed by a comma and optional white-space
,\s*
)
# Zero or more times:
*
# Followed by:
(
# An IP address:
\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
# Optionally followed by either:
(
# a CIDR suffix
(\/(3[0-2]|[012]?\d))
|
# or a subnet mask:
;\b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})\b
)?
)
# Zero or once (to allow empty strings):
?
# End of line
$
当然,这只支持 IPv4 地址。