如何判断一个字符串是否是IP地址?任何一个 IPv4 或者 IPv6?

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

我认为这将是 正则表达式 回答。

有帮助吗?

解决方案

但问题并不像假设那么简单 a.b.c.d ... 形式比你想象的要多得多.

但这肯定是谷歌的问题吗?差不多 每一个 你可以在任何地方找到正则表达式入门,以 IP 为例! IPv4 + 正则表达式 点击量达183,000次!

其他提示

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

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

在 .NET 中有一个 IPAddress 类型,它有一个方便的方法 尝试解析.

例子:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

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

对于 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。

@未切片:确实,这个问题可能会变得有点疯狂。

如果您确实需要处理任何可能的 IP 地址,那么您必须组合一些更复杂的东西。

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

@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

由于该正则一半处理了最后一部分没有段的事实,因此,如果您钉住'',则可以将其切成两半。到您可能的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)
}

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

我不确定 IPv6 规则。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top