我正在寻找有效的.NET Regex,以便验证包含以逗号分隔的IP列表的字符串。 IP可以是单个IP( 192.168.12.5 ),屏蔽IP( 192.168.0.0; 255.255.0.0 )或CIDR表示法( 192.168.0.0/16 )。
用户正确输入的一个样本可以是:
192.168.12.5,192.168.15.7,192.168.0.0; 255.255.0.0,192.168.0.0 / 16
一个样本不正确的输入:
192.168.12.5,的 192.168.15 下,* 192.168.0.0; 255.255.0.0; 255.255.0.0 *,192.168.0.0/16
此字符串也可以为空。我将使用正则表达式来验证客户端/服务器端的输入,使用MVC3中的DataAnnotation正则表达式匹配。
答案 0 :(得分:3)
如果你想要精确,仅仅验证每个八位字节包含三位数是不够的;您需要验证它在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地址。
答案 1 :(得分:1)
此正则表达式将根据您描述的要求进行验证。
([\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}[/]*[\d]{0,3}[,;]*)*
答案 2 :(得分:0)
您可以使用此正则表达式
^(?!^;|.*,$)(;?\d{1,3}(\.\d{1,3}){3}(/\d{1,3})?,?)*$