C#正则表达式验证“真实”的IP值

3

正则表达式可以验证一个值是否具有以下特征之一:

123-29-123-123.subdomain.zomg.com:8085
123.12.34.56:420

很遗憾,我非常不擅长正则表达式、C#、谷歌搜索以及专有名词和普通名词之间的区别。

实际上,它可以是一个大致的近似值,我会使用任何以 : 冒号分隔符和端口为后缀的内容。


3
第一个示例实际上是一个带有端口的主机名,而不是带有端口的IP地址。您想验证仅限IP地址,还是包括主机名在内? - Matt Stephenson
3个回答

2

这个能行吗?

^(?<Host>[^:]+)(?::(?<Port>\d+))?$

这给我带来了以下内容:
主机 = 123-29-123-123.subdomain.zomg.com
端口 = 8085
以及
主机 = 123.12.34.56:420
端口 = 420

1
是的,但那个时候端口格式无论如何都会失败100%的时间。 - John Gietzen
我认为这有点太宽松了。它匹配像 ?*&%#.?*&%#.?*&%#.?*&%#.?*&%#.:4 这样的内容,将 ?*&%#.?*&%#.?*&%#.?*&%#.?*&%#. 作为主机名。那是一个有效的主机名吗? - FrustratedWithFormsDesigner
2
@沮丧:不,它不是。正则表达式不是解析器。不要使用正则表达式进行解析。使用正则表达式进行模式匹配。唯一确定它是否为有效主机名的方法是尝试将其用作主机名。那么判断主机是否在线的正则表达式是什么? - John Gietzen

0

可以使用我所谓的匹配失效符号 (?! ) 来否定一个匹配(如果后缀不存在则匹配)。我写了一篇博客文章,题为:.Net 中的正则表达式(Regex)匹配失效符号 (?! )

在 (?! 后缀) 中,如果匹配到后缀,则匹配失败。我已经考虑到了 256-999 和 000 的可能性,使用了 (?! )。这是模式,请使用 IgnorePatternWhiteSpace,因为我已经注释了模式:

string pattern = @"
^(                      # Anchor to the beginning of the line
                        # Invalidations
  (?!25[6-9])              # If 256, 257...259 are found STOP
  (?!2[6-9]\d)             # If 260-299 stop
  (?![3-9]\d\d)            # if 300-999 stop
  (?!000)                  # No zeros
  (\d{1,3})             # Between 1-3 numbers
  (?:[.-]?)             # Match but don't capture a . or -
 ){4,6}                 # IPV4 IPV6
(?<Url>[A-Za-z.\d]*?)   # Subdomain is mostly text
(?::)
(?<Port>\d+)";

HTH


我认为这被称为负向先行断言(http://www.regular-expressions.info/lookaround.html)。 - João Portela

0

最简单的正则表达式可能是:

(\d{1,3}\.\d{1,3}\.\d{1,3})(:\d+)?

但是... 这将允许像999.999.999这样的东西,这不是一个有效(格式有效,但值无效)的IP地址。

如果您想验证每个块,最好在正则表达式之外进行验证。


你可以使用[01]?\d{1,2}|2[01234]\d|25[012345]代替\d{1,3},以匹配0到255之间的数字。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接