0

テキストからポート付きのIPアドレスを抽出したいと思います。

しかし、正規表現を取得して、可能な限り最大の一致する数字 (IP オクテット) を取得する方法がわかりません。たとえば、209 と式 \d{1,3} から、9 だけではなく 209 全体をキャプチャします。

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 で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 桁が切り取られていますが、これは正しくありません。

于 2013-05-01T13:06:37.603 に答える