用于逗号分隔的IP列表的正则表达式,可以具有单个或屏蔽的IP

时间:2013-02-19 17:56:44

标签: c# .net regex asp.net-mvc-3 data-annotations

我正在寻找有效的.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正则表达式匹配。

3 个答案:

答案 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})?,?)*$