どちらのキャプチャ グループも希望どおりに動作しないため、正規表現が正しくありません。 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]+) :(.*)"