C# 用于IP地址的正则表达式
我尝试使用以下源代码提取wan_IP的值(IP地址): 怎么了?!我确信正则表达式模式是正确的C# 用于IP地址的正则表达式,c#,.net,regex,C#,.net,Regex,我尝试使用以下源代码提取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
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(@“[\b\d{1,3}。\d{1,3}。\d{1,3}\d{1,3}\b”)尝试以下操作:
Match match = Regex.Match(input, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
if (match.Success)
{
Console.WriteLine(match.Value);
}
非常旧的POST,您应该使用已接受的解决方案,但是考虑使用IPG4地址的右正则表达式:
((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]?)$
避免使用
/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])
)信用证:我知道这篇文章并不新鲜,但是,我已经尝试了一些建议的解决方案,没有一个能像我发现的那样好,这要感谢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.");
}
对于新的正则表达式,这是无效的,这是正确的:355.168.0.1=如注释中所述,不匹配
我欢迎对此进行任何调整,因为我正在开发一个使用表达式的工具,并且一直在寻找更好的方法
更新:我创建了一个.NET Fiddle项目,以提供此表达式的工作示例以及测试各种值的IP地址列表。请随意修改它并尝试各种值来练习此表达式,如果发现表达式失败,请提供任何输入
更新2:最好参考以下帖子:
谢谢,我希望这有帮助!Regex(@“\A\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\z”)试试这个我从.at DataAnnotations namespace获取了这个模式。正如您可能看到的,我只从源代码获取了原始模式的一部分
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])$");
检查此项。如果您只想检查正确的IP地址,请使用IPAddress.TryParse,它应该可以正常工作
using System.Net;
bool isIP(string host)
{
IPAddress ip;
return IPAddress.TryParse(host, out ip);
}
在Python中:
>>ip_regex=r'^{0}\.{0}\.{0}$'.格式(r'(25[0-5]|(?:2[0-4]| 1\d |[1-9])?\d)
>>>匹配(ip_regex,'10.11.12.13')
>>>(组)
('10', '11', '12', '13')
>>>
另一种变体,取决于您希望如何处理填充(例如,a.b.c.00被视为无效格式):
^(25[0-5]| 2[0-4][0-9]|[1]|[1-9][1-9]|[1-9]|[1-9]|[1-9]|[0-5]|[2[0-4][0-9]|[1]|[1-9]|[1-9]|[1-9]|[1-9]|[1-9]| | | | 0-1]|{3})$撇开表达式不谈,你不应该看
Regex.Matches
而不是Split
?可能重复999.999.999
?@Andrey没关系,这是一个字符串,最近可以用ipaddress.TryParse
或其他什么签入。这里的主要内容是获取应该使用的字符串是IP.Exception。删除正则表达式中的第一个[String@h0scHberT,如果@John的建议有效,我会这么做。如果不行,试试@SwDevMan81的代码:首先检查是否有匹配看起来更安全。如果没有匹配,我的(快速)建议可能会产生错误(我有点C#新手…)。如果IP位于192.168.1.15中,则不适用于情况。对于008.008.008.008.008,则不适用于无效的IP地址,但您的模式会接受它。我从未声称它只匹配有效的IP地址。不应使用regex执行此操作。为什么您会在使用以下解决方案询问一年多后回答一个已回答的问题:问题是什么?问题是提取一个子字符串——你的解决方案只匹配一个精确的字符串,并且对前面的答案没有任何补充。它处理192.1681.151…+1192.1681.151?为什么需要考虑它?请解释它,以便它为那些真正搜索这个问题的人提供价值。理解您的代码而不进行解释,解决方案已经很明显了。通过使用我的.NET FIDLE项目,每次测试都可以正确地执行此操作。无法100%确定此操作与我的表达式之间的巨大差异。此操作不正确,请参阅上面指向.NET FIDLE的链接,我已将此表达式添加到测试列表中。抱歉,我没有他的不起作用。请检查我的答案中链接的.NET Fiddle项目-我已将此表达式添加到列表中。你可以注释掉我的,取消注释你的,然后注意它没有按预期工作。此项返回false表示“0.254.255.0”@dont_trust_me感谢你指出这一点。它似乎在上面链接的.NET Fiddle项目中正常工作(我已将您的示例添加到fiddle项目中)。“0.254.255.0不匹配。(视为无效)”-你是如何获得有效的?看起来不错,但当我使用它时,如果我将无效字符附加到有效的IPE中,它也会匹配。如果你是对的,正则表达式支持前缀和后缀,我会编辑我的答案。OP要求的是c#解决方案,而不是Python。在Unity中,这为“123”O提供了真值
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])$");
(\d{1,3}\.){3}(\d{1,3})[^\d\.]
using System.Net;
bool isIP(string host)
{
IPAddress ip;
return IPAddress.TryParse(host, out ip);
}