Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?

Mary-Kate Olsen
Lepaskan: 2024-11-04 12:43:02
asal
205 orang telah melayarinya

How does `std::match_results::size()` determine the number of matches in a regular expression?

Menentukan Saiz Regex Padanan dengan std::match_results::size()

std::match_results::size() menyediakan cerapan tentang bilangan kumpulan padanan dan nilai padanan penuh dalam padanan regex. Mari kita mendalami fungsinya.

Dalam kod C 11, std::match_results::size() digunakan untuk mendapatkan maklumat tentang padanan regex. Ia mengembalikan kiraan yang merangkumi keseluruhan perlawanan serta mana-mana kumpulan tangkapan yang mungkin telah ditentukan dalam ungkapan biasa. Walau bagaimanapun, nilai yang diberikannya mungkin berbeza daripada jumlah perlawanan yang dijangkakan.

Pertimbangkan contoh berikut:

<code class="cpp">std::string haystack("abcdefabcghiabc");
std::regex needle("abc");
std::smatch matches;
std::regex_search(haystack, matches, needle);
std::cout << matches.size() << std::endl;</code>
Salin selepas log masuk

Dalam kes ini, anda mungkin menjangkakan mendapat keputusan daripada 3 perlawanan. Walau bagaimanapun, anda hanya akan menerima 1 kerana regex_search() mendapatkan hanya satu padanan. Fungsi size() melaporkan kiraan kumpulan tangkapan serta keseluruhan perlawanan.

Untuk menjelaskan, std::match_results memegang butiran padanan dan sebarang subpadanan yang ditemui. Jika carian regex berjaya, ia tidak akan kosong. Ia mengandungi satu siri objek sub_match, dengan yang awal mewakili padanan penuh. Objek sub_match lain dalam objek match_results sepadan dengan subkumpulan dalam ungkapan regex (ditunjukkan dengan kurungan).

Sebagai contoh, pertimbangkan ungkapan biasa berikut:

<code class="cpp">"ab(c)"</code>
Salin selepas log masuk

Ia mempunyai kumpulan tangkapan yang memerangkap watak "c." Kod berikut menggunakan std::regex_iterator untuk mencari berbilang padanan, melindungi daripada pemusnahan rentetan:

<code class="cpp">std::string str("abcdefabcghiabc");
std::regex rgx1("abc");
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
    std::cout << smtch[0] << std::endl;
    str = smtch.suffix().str();
}</code>
Salin selepas log masuk

Kod ini mencetak "abc" tiga kali.

Sebagai alternatif, std::sregex_iterator boleh digunakan, menyediakan kaedah yang lebih cekap dan memelihara rentetan:

<code class="cpp">std::string s = "abcdefabcghiabc";
for (std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
     i != std::sregex_iterator();
     ++i)
{
    std::smatch m = *i;
    std::cout << "Match value: " << m.str() << "\n";
    std::cout << "    Capture: " << m[1].str() << "\n";
}</code>
Salin selepas log masuk

Kod ini mencetak padanan penuh dan nilai tangkapan, menawarkan pemahaman menyeluruh tentang tingkah laku std::match_results::size().

Atas ialah kandungan terperinci Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!