-1

我正在寻找有效的 .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,19​​2.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 正则表达式匹配来验证客户端/服务器端的输入。

4

3 回答 3

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 地址。

于 2013-02-19T18:33:47.550 回答
1

此正则表达式将根据您描述的要求进行验证。

([\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}[/]*[\d]{0,3}[,;]*)*
于 2013-02-19T18:00:13.143 回答
0

你可以使用这个正则表达式

^(?!^;|.*,$)(;?\d{1,3}(\.\d{1,3}){3}(/\d{1,3})?,?)*$
于 2013-02-19T18:07:48.360 回答