GNU/Linux >> Linux の 問題 >  >> Linux

正規表現のグループ化は C++ 11 の正規表現ライブラリと一致します

どちらのキャプチャ グループも希望どおりに動作しないため、正規表現が正しくありません。 1 つ目は、セット [a-zA-Z0-9] からの単一の文字と一致するように見えます 続いて <space>: 、これは 1 文字のユーザー名で機能しますが、それ以外は機能しません。 0 個以上の文字を探しているため、2 番目のキャプチャ グループは常に空になりますが、一致を貪欲に指定するべきではありません。つまり、0 文字の一致が有効な結果であることを意味します。

これらの両方を regex 修正する

std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");

しかし、単に regex をインスタンス化するだけです と match_results オブジェクトは一致を生成しません。regex を適用する必要があります アルゴリズム。入力文字列の一部のみを一致させたいため、この場合に使用する適切なアルゴリズムは regex_search です。 .

std::regex_search(s, matches, rgx);

すべてをまとめる

    std::string s{R"(
tХB:[email protected] Connected
tХB:[email protected] WEBMSG #Username :this is a message
tХB:[email protected] Status: visible
)"};

    std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
    std::smatch matches;

    if(std::regex_search(s, matches, rgx)) {
        std::cout << "Match found\n";

        for (size_t i = 0; i < matches.size(); ++i) {
            std::cout << i << ": '" << matches[i].str() << "'\n";
        }
    } else {
        std::cout << "Match not found\n";
    }

ライブデモ


"WEBMSG #([a-zA-Z0-9]) :(.*?)"

この正規表現は、1 文字の長さのユーザー名とセミコロンの後の任意のメッセージを含む文字列のみに一致しますが、2 番目のグループは常に空になります。

これは動作するはずです:

"WEBMSG #([a-zA-Z0-9]+) :(.*)"

Linux
  1. C++:どの正規表現ライブラリを使用すればよいですか?

  2. Linux 上の C++ 動的共有ライブラリ

  3. C++ で端末のフォント サイズを変更する

  1. C++ コマンド ライン インターフェイス

  2. Clang は GCC でコンパイルされた .a ライブラリでコードをコンパイルできますか?

  3. Eclipse GUI を使用した C++ アプリケーションのリモート デバッグ

  1. C++で一時ディレクトリを作成するには?

  2. bashコードで正規表現を使用する場合

  3. Linuxで正規表現を使用してファイルの名前を変更する