GNU/Linux >> Belajar Linux >  >> Linux

Pengelompokan regex cocok dengan pustaka regex C++ 11

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]+) :(.*)"

Linux
  1. C++:pustaka regex apa yang harus saya gunakan?

  2. C++ Dynamic Shared Library di Linux

  3. Bagaimana cara membuat direktori sementara di C++?

  1. Ubah Ukuran Font Terminal dengan C++

  2. Antarmuka baris perintah C++

  3. Bagaimana cara menautkan Perpustakaan C Runtime dengan 'ld'?

  1. Menghitung jumlah total kecocokan dengan grep, bukan hanya berapa banyak baris yang cocok

  2. jika dengan regex dalam kode bash

  3. Mengganti nama file di linux dengan regex