在正则表达式中选择可能出现的最大次数

本文关键字:正则表达式 选择 | 更新日期: 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位数字仍然被切断以形成端口号,这是不正确的。