【问题标题】:Regex for comma seperated IPs list which could have single or masked IPs逗号分隔的 IP 列表的正则表达式,它可能有单个或屏蔽的 IP
【发布时间】:2013-02-19 17:56:44
【问题描述】:

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

【问题讨论】:

  • 我相信你现在已经知道这个练习了:请告诉我们你到目前为止做了什么,即使它不起作用。
  • 老实说,我尝试了很多。我进入了这里给出的方式:stackoverflow.com/questions/14879964/…
  • 192.168.0.0/16应该选择什么?您在输入字符串中包含;,这是错字吗?还是逗号/分号分隔?您的问题与您链接的问题有何不同?
  • 我想使用 MVC3 中的数据注释正则表达式匹配来验证字符串。 “;”用于将 IP 与掩码分开。
  • 192.168.0.0/16 有效吗?

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


【解决方案1】:

如果您想要精确,仅仅验证每个八位字节包含三个数字是不够的;您需要验证它是否介于 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)

然后,您需要为逗号分隔的列表重复整个组。将所有内容放在一起,为清楚起见添加了空格和 cmets:

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

【讨论】:

  • 这很有可能成为公认的答案。我目前无法对其进行测试。希望这也与 IE 兼容,我最近看到我的其他 regx 未能在 IE 中验证。
  • @Amyz:如果去掉空格和 cmets,这也适用于客户端验证。
  • 这就像一个魅力 - 你救了我的命,非常感谢。
【解决方案2】:

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

([\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}[/]*[\d]{0,3}[,;]*)*

【讨论】:

  • 很抱歉,您不清楚。我不想抓住每一个。我想使用 MVC3 中的数据注释正则表达式匹配来验证字符串。
  • 我目前无法对其进行测试。但看起来您使用逗号和分号作为分隔符。我只需要使用逗号作为不同 IP 之间的分隔符。分号可用于将 IP 与其掩码分开,仅用于掩码的 IP。
【解决方案3】:

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

^(?!^;|.*,$)(;?\d{1,3}(\.\d{1,3}){3}(/\d{1,3})?,?)*$

【讨论】:

  • 我认为这不会验证被屏蔽的 ips
  • 我目前无法对其进行测试。 VS卡在某个地方。但是您没有在任何地方使用分号 (;)?
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多