【问题标题】:How to evaluate an IP?如何评估IP?
【发布时间】:2023-03-23 15:00:01
【问题描述】:

如何确定字符串是否为 IP 地址? IPv4 还是 IPv6

最少和最多的字符数是多少?

我认为这将是一个 regex 答案。

【问题讨论】:

    标签: regex validation language-agnostic ip-address


    【解决方案1】:

    我以前做过,但我喜欢 Raymond Chen 的帖子:

    http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

    他基本上提倡使用正则表达式来做他们擅长的事情:解析标记。然后评估结果。他的例子:

    function isDottedIPv4(s)
    {
     var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
     return match != null &&
            match[1] <= 255 && match[2] <= 255 &&
            match[3] <= 255 && match[4] <= 255;
    }
    

    查看它并了解它应该做什么要容易得多。

    【讨论】:

    • 我在各种输入上对其进行了测试。似乎是防弹的。
    【解决方案2】:

    在 .NET 中有一个 IPAddress 类型,它有一个方便的方法TryParse

    例子:

    if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
        //validatedIPAddress is good
    }
    
    // or more simply:
    bool IsValidIPAddress(string possibleIP){
        return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
    }
    

    【讨论】:

      【解决方案3】:

      对于 IPv4,您可以使用此正则表达式。

      \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
      

      它看起来很复杂,但它通过将每个四边形限制为数字 0-255 来工作。

      【讨论】:

        【解决方案4】:

        @unsliced 是正确的,但它当然取决于实现,如果您从访问您网站的用户那里解析 IP,那么您可以使用正则表达式,因为它应该是 x.x.x.x 格式。

        对于 IPv6,您可以使用它

        [A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}
        

        但是它并不能捕获所有内容,因为使用 IPv6 它要复杂得多,根据维基百科,以下所有示例在技术上都是正确的,但是上面的正则表达式只会捕获带有 * 的示例

        2001:0db8:0000:0000:0000:0000:1428:57ab*
        2001:0db8:0000:0000:0000::1428:57ab*
        2001:0db8:0:0:0:0:1428:57ab*
        2001:0db8:0:0::1428:57ab
        2001:0db8::1428:57ab
        2001:db8::1428:57ab
        

        【讨论】:

          【解决方案5】:

          由于该正则表达式的一半处理了最后一段没有句号的事实,因此如果您添加一个“。”,您可以将其切成两半。到您可能的 IP 地址的末尾。

          类似这样的:

          bool IsValidIPAddress(string possibleIP){
            CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
            return Regex.Match(possibleIP+'.', CrazyRegex)
          }
          

          【讨论】:

            【解决方案6】:

            IPv4 变为:/\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

            我不确定 IPv6 规则。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-01-07
              • 2021-12-01
              • 2011-08-14
              • 1970-01-01
              • 1970-01-01
              • 2014-07-25
              相关资源
              最近更新 更多