IP地址的正则表达式

10

我尝试了这段代码用于验证IP地址,但它不起作用...

public static bool IP(string ipStr)
{
    string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
    Regex check = new Regex (pattern);
    bool valid = false;
    if (ipStr == "") {
        valid = false;
    } else {
        valid = check.IsMatch (ipStr, 0);
    }
    return valid;
}   

你知道是什么问题吗?


14
有什么问题吗?直到你告诉我们“不起作用”意味着什么,我们才知道。 - ildjarn
为什么需要使用正则表达式来验证IP地址?一个简单的 string.Split()Int.Parse() 就可以完成。 - Shiplu Mokaddim
1
你需要澄清哪一部分出了问题。我为这个正则表达式构建了一个测试,它似乎以一些不寻常的分组方式获取IP地址,但它仍然有效。 - deltree
4
用正则表达式无法真实地验证一个IP地址。对于某些人来说,10.0、172.16.0、0177.00000.0x0.1、0x7F000001、017700000001和2130706433都是有效的IP地址,而4294967296显然是不合法的。当你的正则表达式足够接受4294967295并拒绝4294967297时,你已经超出了正则表达式的范围。 - Old Pro
任何可以用有限状态机表达的东西都属于“正则表达式空间”。 - Bojidar Stanchev
6个回答

63

我会使用IPAddress.TryParse静态方法。

IPAddress ip;
bool b = IPAddress.TryParse("1234.12.12.12",out ip);

5
很棒的回答。采用了现有的且更易读的解决方案解决了问题。+1 - Razor
3
这种方法会产生一些相当奇怪的结果。输入整数将被验证。例如:IPAddress.TryParse("255555", out ip) 将返回 true,其 IP 地址为:{0.3.230.67}。 - Dave Hogan
6
@DaveHogan 这并不奇怪,也是完全合法的。例如,IPAddress.TryParse("2130706433", out ip);IPAddress.TryParse("0x7f000001", out ip); 是另一种表示方式,表示的是 127.0.0.1 - L.B
3
我阅读了文档并注意到它接受八进制、十进制和十六进制输入。在验证输入时,这是需要注意的事项。如果有人在我的字段中输入数值1,我希望会出现错误提示而不是假设这是IP地址0.0.0.1。 - Dave Hogan
2
TryParse 方法在测试 IP 地址方面不是十分可靠,请查看文档中的备注:https://learn.microsoft.com/de-de/dotnet/api/system.net.ipaddress.tryparse?view=netcore-1.1 - user5380008
显示剩余2条评论

7

要匹配有效的IP地址,请使用以下方法

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

替代

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

由于许多正则表达式引擎匹配OR序列中的第一个可能性,因此您可以尝试您的正则表达式引擎:10.48.0.200。在这里测试差异:http://gskinner.com/RegExr/?35833


2

1

我并不是一个正则表达式专家,但我使用Expresso(一个正则表达式工具),它有自己的正则表达式库,用于预设类似这样的场景。请尝试下面的代码。

string pattern = @"(?<First>2[0-4]\d|25[0-5]|[01]?\d\d?)\.(?<Second>2[0-4]\d|25[0-5]|[01]?\d\d?)\.(?<Third>2[0-4]\d|25[0-5]|[01]?\d\d?)\.(?<Fourth>2[0-4]\d|25[0-5]|[01]?\d\d?)";

1
这是用于检查所有可能的IPv4地址(点分十进制、点分十六进制、点分八进制、十进制、十六进制、八进制和混合模式)的完整正则表达式。
^(0[0-7]{10,11}|0(x|X)[0-9a-fA-F]{8}|(\b4\d{8}[0-5]\b|\b[1-3]?\d{8}\d?\b)|((2[0-5][0-5]|1\d{2}|[1-9]\d?)|(0(x|X)[0-9a-fA-F]{2})|(0[0-7]{3}))(\.((2[0-5][0-5]|1\d{2}|\d\d?)|(0(x|X)[0-9a-fA-F]{2})|(0[0-7]{3}))){3})$

我已经用所有可能的地址进行了测试。



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