Ekspresi reguler Anda salah karena tidak ada grup tangkap yang melakukan apa yang Anda inginkan. Yang pertama mencari untuk mencocokkan satu karakter dari set [a-zA-Z0-9]
diikuti oleh <space>:
, yang berfungsi untuk nama pengguna karakter tunggal, tetapi tidak untuk yang lain. Grup tangkap kedua akan selalu kosong karena Anda mencari nol karakter atau lebih, tetapi juga menentukan kecocokan tidak boleh serakah, yang berarti kecocokan nol karakter adalah hasil yang valid.
Memperbaiki kedua regex
Anda menjadi
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
Tapi cukup membuat instance regex
dan match_results
objek tidak menghasilkan kecocokan, Anda perlu menerapkan regex
algoritma. Karena Anda hanya ingin mencocokkan sebagian dari string input, algoritme yang sesuai untuk digunakan dalam kasus ini adalah regex_search
.
std::regex_search(s, matches, rgx);
Menyatukan semuanya
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";
}
Demo langsung
"WEBMSG #([a-zA-Z0-9]) :(.*?)"
Regex ini hanya akan cocok dengan string, yang berisi nama pengguna dengan panjang 1 karakter dan pesan apa pun setelah titik koma, tetapi grup kedua akan selalu kosong, karena mencoba menemukan kecocokan karakter apa pun yang kurang serakah dari 0 hingga tidak terbatas.
Ini harus bekerja:
"WEBMSG #([a-zA-Z0-9]+) :(.*)"