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

C# 选择正则表达式中可能出现的最大次数,c#,regex,C#,Regex,我想从文本中提取带有端口的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 Anonymo

我想从文本中提取带有端口的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地址,并将其错误地拆分。您可以给它输入字符串
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})"
@“(?(?:[12]?\d{1,2}\){3}[12]?\d{1,2})\s+(?\d{2,4})”
请注意,端口号的范围从1到65535(端口0是保留的),因此您可能需要将端口的正则表达式从
(?\d{2,4})
修改为
(?\d{1,5})

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

正则表达式开头的
*
消耗了您想要匹配的文本,而结尾的
*
只是多余的。删除它们,您的代码就会正常工作

您当前的正则表达式可能匹配一个没有端口号的单独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})"
@“(?(?:[12]?\d{1,2}\){3}[12]?\d{1,2})\s+(?\d{2,4})”
请注意,端口号的范围从1到65535(端口0是保留的),因此您可能需要将端口的正则表达式从
(?\d{2,4})
修改为
(?\d{1,5})

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

@joudiekjouda:注意,在您的正则表达式中还有我在最新编辑中指出的其他问题。是的,我也发现了这一点。但是我相信更好的方法是:
@((?(?:[12]?\d{1,2}\){3}[12]?\d{1,2})\s*[\s:][\s*(?\d{2,4})”
因为ip地址有时在文本中是一个整体(192.168.1.1:8080)@joudiekjouda:注意,在您的正则表达式中还有我在最新编辑中指出的其他问题。是的,我也发现了。但我认为最好是:
“(?(?:[12]?\d{1,2}\){3}[12]?\d{1,2})\s*[\s:][\s*(?\d{2,4})”
,因为ip地址有时在文本中是一个整体(192.168.1.1:8080)