如何评估一个IP?

时间:2020-03-05 18:47:13  来源:igfitidea点击:

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

最少和最多几个字符是多少?

我认为这将是一个正则表达式的答案。

解决方案

回答

对于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来工作。

回答

但是问题并不像假设" a.b.c.d"那么简单……存在比我们意识到的形式更多的形式。

但这肯定是Google的问题吗?我们几乎可以在任何地方找到的每个正则表达式入门都使用IP为例! ipv4 + regex得分183,000次!

回答

由于该正则表达式的一半处理了最后一段末尾没有句点的事实,因此如果我们加上"'",则可以将其切成两半。到我们可能的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)
}

回答

@unsliced:是的,这个问题可能会有点疯狂。

如果我们确实需要处理任何可能的IP地址,则必须将一些更复杂的东西组合在一起。

但是,如果我们只是想进行基本验证以确保用户输入格式正确的数据,我认为将它们限制为具有上述正则表达式的a.b.c.d模型是公平的。

回答

@unsliced是正确的,但是它当然取决于实现,如果我们从访问我们站点的用户那里解析IP,则可以使用regex,因为它应该为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时要复杂得多,根据Wikipedia,以下所有示例在技术上都是正确的,但是上述正则表达式只能捕获带有*的示例

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

回答

在.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)
}

回答

我以前做过,但是我喜欢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;
}

看着它并了解它应该做的事情要容易得多。

回答

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

我不确定IPv6规则。