在正则表达式中选择可能出现的最大次数
本文关键字:正则表达式 选择 | 更新日期: 2023-09-27 18:11:35
我想从文本中提取带有端口的ip地址。
但是我不知道如何获得正则表达式来捕获数字(IP八位元组)的最大可能匹配。例如,从209和表达式'd{1,3}捕获整个209,而不仅仅是9。
Regex rgx = new Regex(@".*(?<ip>(?:[12]?'d{1,2}'.){3}[12]?'d{1,2})'s*(?<port>'d{2,4}).*");
string textWithIPs = "209.90.238.251 3128 HTTPS Anonymous [United States Proxy] United States Washington Renton 84.5% 58.240.224.186 80 HTTP None [China Proxy] China Jiangsu Nanjing 98.4% ";
foreach (Match m in rgx.Matches(textWithIPs))
{
MessageBox.Show("ip: " + m.Groups["ip"].Value + " port: " + m.Groups["port"].Value);
}
预期输出:ip: 209.90.238.251 port: 3128
ip: 58.240.224.186 port: 80
regex 开头的.*
消耗您想要匹配的文本,而末尾的.*
只是多余的。去掉它们,你的代码就能正常工作了。
您当前的正则表达式可能匹配一个没有端口号的单独IP地址,并错误地拆分它。您可以给它输入字符串123.123.123.123
,输出将是IP为123.123.123.1
,端口号为23
,这是不正确的1。我将's*
更改为's+
以解决此问题。
@"(?<ip>(?:[12]?'d{1,2}'.){3}[12]?'d{1,2})'s+(?<port>'d{2,4})"
注意,端口号可以从1到65535(端口0是保留的),所以你可能想要修改端口的正则表达式从(?<port>'d{2,4})
到(?<port>'d{1,5})
。
脚注
1这是在开始删除.*
后的输出。在您的原始正则表达式中,问题仍然存在-最后2位数字仍然被切断以形成端口号,这是不正确的。