RegEx的IP地址

h0s*_*erT 38 .net c# regex

我试着用这个源代码提取wan_ip的值(IP地址):怎么回事?!我确定RegEx模式是正确的.

String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)";
Regex ip = new Regex(@"[\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
string[] result = ip.Split(input);

foreach (string bla in result)  
{
  Console.WriteLine(bla);                
}

Console.Read();
Run Code Online (Sandbox Code Playgroud)

Bar*_*ers 45

[不应该是你的模式的开始.此外,您可能想要使用Matches(...).

尝试:

String input = @"var product_pic_fn=;var firmware_ver='20.02.024';var wan_ip='92.75.120.206';if (parent.location.href != window.location.href)";
Regex ip = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
MatchCollection result = ip.Matches(input);
Console.WriteLine(result[0]); 
Run Code Online (Sandbox Code Playgroud)

  • 我从未声称它只会匹配有效的 IP 地址。这样的事情不应该用正则表达式来完成。 (3认同)

JPB*_*anc 37

很老的帖子,您应该使用已接受的解决方案,但考虑使用正确的RegEx进行IPV4地址:

((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]?)
Run Code Online (Sandbox Code Playgroud)

如果您想在使用之后或之前避免使用特殊字符:

^((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]?)$
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的解决方案 (3认同)
  • 看起来不错,但是当我使用它时,如果我将无效字符附加到有效 IP,它也会匹配 (2认同)
  • 您正确的regex支持前缀和后缀,我编辑了答案。 (2认同)

SwD*_*n81 15

试试这个:

 Match match = Regex.Match(input, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
 if (match.Success)
 {
     Console.WriteLine(match.Value);
 }
Run Code Online (Sandbox Code Playgroud)

  • 192.168.1.15_1?为什么需要考虑呢? (2认同)

小智 5

如果您发现自己正在寻找特定的正则表达式,那么http://regexlib.com/会以库格式提供大量的RegEx.


Eri*_*own 5

我知道这篇文章并不新鲜,但是,我已经尝试了几个提议的解决方案,但由于 Justin Jones 提供的链接,我发现它们的效果都不如我发现的那样好。他们有很多 IP 地址,但这是列表的顶部,并且使用 LinqPad(我喜欢 LinqPad)进行的大多数测试都非常有效。我建议使用这个而不是之前提供的任何表达式:

^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$
Run Code Online (Sandbox Code Playgroud)

使用以下命令在 LinqPad 中试一试:

// \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b  355.168.0.1 = 355.168.0.1 (Not Correct)
// ((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]?) 355.168.0.1 = 55.168.0.1 (Not correct)
// \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$  355.168.0.1 = 355.168.0.1 (Not Correct)
// ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$  355.168.0.1 = No Match (Correct)

Match match = Regex.Match("355.168.0.1", @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$");
if (match.Success) {
    Console.WriteLine(match.Value);
}
else {
    Console.WriteLine("No match.");
}
Run Code Online (Sandbox Code Playgroud)

使用新的 RegEx,这是无效的,这是正确的:355.168.0.1 = 无匹配,如评论中所述,这是正确的。

我欢迎对此进行任何调整,因为我正在开发一个使用该表达式的工具,并且一直在寻找更好的方法来做到这一点。

更新:我创建了一个 .NET Fiddle 项目来提供此表达式的工作示例以及测试各种值的 IP 地址列表。如果您发现表达式失败的情况,请随意修改它并尝试各种值来练习此表达式并提供任何输入。https://dotnetfiddle.net/JoBXdI

更新 2:最好参考这篇文章:另一个相关问题。

谢谢,我希望这会有所帮助!


Geo*_*aph 5

如果您只想检查正确的IP,请使用IPAddress.TryParse

using System.Net;

bool isIP(string host)
{
    IPAddress ip;
    return IPAddress.TryParse(host, out ip);
}
Run Code Online (Sandbox Code Playgroud)