IP 地址的正则表达式

问题描述 投票:0回答:14

我尝试使用以下源代码提取 wan_ip 的值(IP 地址): 怎么了?!我确信正则表达式模式是正确的。

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();
c# .net regex
14个回答
56
投票

[
不应位于图案的开头。另外,您可能想使用
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]); 

50
投票

非常旧的帖子,您应该使用已接受的解决方案,但请考虑对 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]?)$

17
投票

试试这个:

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

16
投票

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

using System.Net;

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

6
投票

我知道这篇文章并不新鲜,但是,我已经尝试了几种建议的解决方案,但没有一个比我通过贾斯汀·琼斯提供的链接找到的解决方案效果更好。 他们有相当多的 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.");
}

使用新的正则表达式,这是无效的,这是正确的:355.168.0.1 = 不匹配,这是正确的,如评论中所述。

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

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

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

谢谢,希望这有帮助!


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

3
投票

避免使用

/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


1
投票

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

0
投票

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

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


0
投票

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


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

检查一下。应该可以完美运行


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}$


0
投票

我看到很多带有 \d{1,3} 的解决方案都避免使用这个,IP 地址范围从 0 到 255,\d{1,3} 不限制它。

这是正确的解决方案:

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


-1
投票

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')
>>>
© www.soinside.com 2019 - 2024. All rights reserved.