8

C++ で文字列を取り、内部に含まれるすべての IP アドレスを見つけて、それらを新しいベクトル文字列に入れようとしています。

正規表現に関する多くのドキュメントを読みましたが、この単純な関数の実行方法を理解できないようです。

この Perl 式を使用して、任意の IP アドレスを見つけることができると思います。

re("\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b");

しかし、私はまだ残りをどうするかについて困惑しています。

4

3 に答える 3

15

おそらく、あなたはこのようなものを探しています。regex_iterator現在のパターンのすべての一致を取得するために使用します。リファレンスを参照してください。

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string text(" 192.168.0.1 abc 10.0.0.255 10.5.1 1.2.3.4a 5.4.3.2 ");
    const char* pattern =
        "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
        "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
        "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
        "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
    boost::regex ip_regex(pattern);

    boost::sregex_iterator it(text.begin(), text.end(), ip_regex);
    boost::sregex_iterator end;
    for (; it != end; ++it) {
        std::cout << it->str() << "\n";
        // v.push_back(it->str()); or something similar     
    }
}

出力:

192.168.0.1
10.0.0.255
5.4.3.2

サイドノート:あなたはおそらく\\b代わりに\b;を意味していました。バックスペース文字を一致させようとしていたとは思えません。

于 2011-04-27T17:09:08.583 に答える
-1

提供されたソリューションは非常に優れています。ありがとうございます。パターン自体にわずかな間違いを見つけましたが。

たとえば、49.000.00.01 のようなものは有効な IPv4 アドレスと見なされますが、私の理解では、そうすべきではありません (ダンプ処理中に発生しただけです)。

パターンを次のように改善することをお勧めします。

"\\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)"
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)"
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)"
"\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\\b";

これにより、0.0.0.0 のみがすべてゼロインとして許可されますが、これは正しいと思われ、すべての .00 が削除されます。.000. 等

于 2013-10-20T16:12:07.007 に答える