RegEx的IP地址

时间:2011-02-03 19:36:29

标签: c# .net 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();

14 个答案:

答案 0 :(得分:44)

[不应该在您的模式的开头。此外,您可能希望使用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]); 

答案 1 :(得分:32)

很老的帖子,您应该使用已接受的解决方案,但考虑使用正确的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]?)

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

^((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]?)$

答案 2 :(得分:14)

试试这个:

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

答案 3 :(得分:5)

如果您发现自己正在寻找特定的正则表达式,http://regexlib.com/会有很多库格式的RegEx。

答案 4 :(得分:3)

Regex.IsMatch(input, @"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$")

答案 5 :(得分:2)

避免使用/b - 它允许在IP之前或之后的字符 例如...198.192.168.12...有效。

如果您可以将输入拆分为可隔离IP地址的块,请使用^$

     Regex regexIP = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$");

     if (regexIP.Match(textBoxIP.Text).Success){
         String myIP = textBoxIP.Text;
     }
上面的

注意不会验证数字,如172所示。 316 .254.1为真。这只会检查正确的格式。

更新:要验证格式和价值,您可以使用

     Regex regexIP = new Regex(@"^([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])\.([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])$");

     if (regexIP.Match(textBoxIP.Text).Success){
         String myIP = textBoxIP.Text;
     }

(注意每个数值使用([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])
信用:https://stackoverflow.com/a/10682785/4480932

答案 6 :(得分:2)

我知道这篇文章不是新的,但是,我已经尝试了几个提议的解决方案,但是由于贾斯汀琼斯提供的链接,它们都没有像我找到的那样有效。他们有很多IP地址,但这是列表的顶部,使用LinqPad(I LOVE LinqPad),我投入的大部分测试工作得非常好。我建议使用这个而不是之前提供的任何表达式:

Stringres

使用以下内容在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])$

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

我欢迎任何调整,因为我正在研究一种利用表达式的工具,并且一直在寻找更好的方法。

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

更新2 :更好的是参考这篇文章:Another related question.

谢谢,我希望这有帮助!

答案 7 :(得分:2)

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

using System.Net;

bool isIP(string host)
{
    IPAddress ip;
    return IPAddress.TryParse(host, out ip);
}

答案 8 :(得分:0)

我认为你需要摆脱[ - 这是一个流浪角色还是什么?

正则表达式(@“的 [ \ B \ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3} \ b “)

答案 9 :(得分:0)

你的正则表达式模式的开头似乎有一个无关的 [

答案 10 :(得分:0)

正则表达式(@" \ A \ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3} \ z")试试用这个

答案 11 :(得分:0)

我从UrlAttribute.cs采用了这种模式。在DataAnnotations命名空间。正如您所看到的,我只从源头中获取了原始模式的一部分。

Regex.IsMatch(input, @"^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-
9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-
9]\d|1\d\d|2[0-4]\d|25[0-5])$");

答案 12 :(得分:0)

(\d{1,3}\.){3}(\d{1,3})[^\d\.] 

检查一下。它应该完美地运作

答案 13 :(得分:0)

另一个变体,具体取决于您要如何处理填充(例如,a.b.c.00被视为无效格式):

^(?25 [0-5] | 2 [0-4] [0-9] | [1]?[1-9] [1-9] | [1-9] {1} | 0 {1})(。(?25 [0-5] | 2 [0-4] [0-9] | [1]?[1-9] [1-9] | [1-9] {1} | 0 {1})){3} $