0

我想从文本中提取带有端口的 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
4

1 回答 1

3

.*则表达式开头的使用您要匹配的文本,.*结尾的只是多余的。删除它们,您的代码应该可以工作。

您当前的正则表达式可能会匹配一个没有端口号的单独 IP 地址并错误地将其拆分。您可以给它输入字符串123.123.123.123,输出将是 IP being123.123.123.1和 port number being 23,这是不正确的1。我\s*改为\s+解决这个问题。

@"(?<ip>(?:[12]?\d{1,2}\.){3}[12]?\d{1,2})\s+(?<port>\d{2,4})"

请注意,端口号的范围可以从 1 到 65535(端口 0 是保留的),因此您可能需要修改端口 from (?<port>\d{2,4})to的正则表达式(?<port>\d{1,5})

脚注

1这是你一开始删除后的输出.*。在您原来的正则表达式中,问题仍然存在 - 最后 2 位数字仍然被截断以形成端口号,这是不正确的。

于 2013-05-01T13:06:37.603 回答