【问题标题】:RegEx for an IP AddressIP 地址的正则表达式
【发布时间】:2011-06-20 22:03:52
【问题描述】:

我尝试使用以下源代码提取 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();

【问题讨论】:

  • 撇开表达式不谈,你不应该看Regex.Matches而不是Split吗?
  • 999.999.999.999 ?
  • @Andrey 没关系,它是最近可以用ipaddress.TryParse 签入的字符串,或其他东西。这里主要是获取应该是IP的字符串。
  • 异常。删除正则表达式字符串中的第一个 [

标签: c# .net regex


【解决方案1】:

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

【讨论】:

  • @h0scHberT,如果@John 的建议有效,我会去做。如果没有,试试@SwDevMan81 的代码:首先检查是否有匹配项看起来更安全。如果没有匹配项,我的(快速)建议可能会产生错误(我有点 C# 新手......)。
  • IP在192.168.1.15_1的情况下不起作用
  • 不适用于不是有效 IPAddress 但您的模式接受的 008.008.008.008。
  • 我从未声称它只会匹配有效的 IP 地址。这样的事情不应该用正则表达式来做。
【解决方案2】:

非常老的帖子,您应该使用公认的解决方案,但考虑使用正确的正则表达式作为 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]?)$

【讨论】:

  • 看起来不错,但是当我使用它时,如果我将无效字符附加到有效 IP,它也会匹配
  • 你是对的正则表达式支持前缀和后缀,我编辑我的答案。
  • \b(...)\b 可能也值得添加?顺便说一句,答案很好。
【解决方案3】:

试试这个:

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

【讨论】:

  • 正在处理192.168.1.15_1..+1的情况
  • 192.168.1.15_1?为什么需要考虑它?
【解决方案4】:

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

using System.Net;

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

【讨论】:

  • 在 Unity 中,这对“123”ô.O 来说是正确的
【解决方案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])$

使用以下内容在 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.");
}

对于新的 RegEx,这是无效的,这是正确的:355.168.0.1 = 不匹配,这是正确的,如 cmets 中所述。

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

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

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

谢谢,希望对您有所帮助!

【讨论】:

  • 这个返回 false 为 "0.254.255.0"
  • @dont_trust_me 感谢您指出这一点。它似乎在我上面链接的 .NET Fiddle 项目中正常工作(我将您的示例添加到了 fiddle 项目中)。 “0.254.255.0 不匹配。(被认为无效)” - 你如何变得有效?
【解决方案6】:
Regex.IsMatch(input, @"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$")

【讨论】:

  • 为什么你要回答一个已经回答了一年多的问题,但在提出一个不起作用的解决方案之后?问题是关于提取子字符串 - 您的解决方案只匹配一个确切的字符串,并绝对添加 nothing 到以前的答案。
【解决方案7】:

避免使用/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 是真的。这只检查正确的格式。


更新:要验证 FORMATTING 和 VALUES,您可以使用

     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

【讨论】:

    【解决方案8】:

    我认为您需要摆脱 [ - 那是一个流浪字符还是什么?

    正则表达式(@"[\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b ")

    【讨论】:

      【解决方案9】:

      Regex(@"\A\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\z") 试试这个

      【讨论】:

      • 这不能正常工作,请参阅上面的 .NET fiddle 链接,我已将此表达式添加到测试列表中。
      【解决方案10】:

      我从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])$");
      

      【讨论】:

      • 请解释一下,以便为实际搜索此问题的人提供价值。对于那些无需解释就能理解您的代码的人,解决方案已经很明显了。
      • 使用我的 .NET Fiddle 项目,每次测试都能正常工作。不是 100% 确定这和我的表达之间有什么大的不同。
      【解决方案11】:
      (\d{1,3}\.){3}(\d{1,3})[^\d\.] 
      

      检查这个。它应该可以完美运行

      【讨论】:

      • 对不起,这不起作用。检查我的答案中链接的 .NET Fiddle 项目 - 我将此表达式添加到列表中。你可以注释掉我的,取消注释你的,并注意到它没有按预期工作。
      【解决方案12】:

      在 Python 中:

      >>> ip_regex = r'^{0}\.{0}\.{0}\.{0}$'.format(r'(25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)')
      >>> match(ip_regex, '10.11.12.13')
      <re.Match object; span=(0, 11), match='10.11.12.13'>
      >>> _.groups()
      ('10', '11', '12', '13')
      >>>
      

      【讨论】:

      • OP 要求的是 c# 解决方案,而不是 Python。
      【解决方案13】:

      另一种变体,取决于您要如何处理填充(例如 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}$

      【讨论】:

        猜你喜欢
        • 2017-03-15
        • 2015-11-22
        • 2013-02-21
        • 1970-01-01
        • 2012-04-17
        • 2012-12-23
        相关资源
        最近更新 更多