C++ dasturlash tilining regex, type info va forward_list kutubxonalari funksiyalari bilan ishlash
1Mavzu: C++ dasturlash tilining regex, type info va forward_list kutubxonalari funksiyalari bilan ishlash. Reja: 1. regex ning C++ dagi funksiyalari. 2. type info C++ dagi funksiyalari. 3. forward_list C++ dagi funksiyalari.
21. Regular expression va undan C++ da foydalanish Regex berilgan belgilar to'plamini ichidan siz bergan ifoda bo'yicha belgilar to'plamini olish. Unchalik tushunarsiz bo'ldimi? Shoshilmang, hozir uni amaliyotda ko'ramiz va u o'ylaymanki sizga yoqib qoladi :) Oddiy bir misol, sizga gap berilgan, o'sha gap ichidan e-mail manzillarini ko'rsatib berishingiz kerak. Qoyil, siz buni qiynalmasdan bajara olasiz! Lekin qanday? Siz beixtiyor harflar va raqamlar aralashgan ifoda(username) va undan keyin keladigan kuchukcha belgisi va domen yozilgan belgilar to'plamini e-mail manzil deb ko'rsatasiz(masalan , cppcoder24@gmail.com ) va siz e-mail ni topishda o'z qolipingizdan foydalandingiz(<username>@<domen>). Ya'ni e-mail manzilni qanday formada bo'lishini bilasiz. Endi shuni dasturimizga tatbiq qilib ko'ramiz. Agar siz qidirish tizimlaridan, so'zni qidirish va uni boshqasi bilan almashtirish funksiyalaridan, oddiy matn muxarrirlaridan foydalangan bo'lsangiz, demak siz uni amaliyotda ko'rgansiz! Shuningdek, regex dan parollarni kuchli-kuchsiz tuzilganini tekshirishda ham ishlatishadi. Regex da qidirish belgilardan iborat ifoda yordamida amalga oshiriladi, bu ifoda qolip vazifasini bajaradi. C++ da kod yozib ko'rganlar juda yaxshi bilishadi, unda ma'lumotlarni to'g'ri ekanligini tahlil qilish bir muncha murakkab jarayon. Masalan, foydalanuvchidan son kiritishni so'radingiz, kiritiladigan narsani siz string da olib, uni haqiqatda sonmi-yo'qmi bilmoqchisiz. Har bir dasturchi bu jarayonda o'zining tekshirish algoritmini yozib chiqishga majbur bo'ladi. Lekin C++ 11 da regex kirib keldi va bu endi muammo emas! C++ 11 ECMAScript, awk, grep va yana bir nechta regular expression grammatikasini qo'llab-quvvatlaydi, biz ECMAScript sintaksisini ko'rib o'tamiz. Regex kutubxonasini kodimizda import qilamiz: #include <regex>bu orqali biz regex dan kodimizda foydalana olishimiz mumkin. Lekin bu C++11 va undan yuqorida ishlaydi. DIQQAT! Namunadagi kodlar main funksiyasi ichiga yoziladi: #include <iostream> #include <regex> using namespace std; int main()
3{ Endi c++ da kod yozib, uni sinab ko'rish uchun biror muhitni oching :)C++ 11 ni sozlash . Sozlashni Code::Blocks muhitida ko'rib o'tamiz. Birorta konsol proyekt ochib, yuqorida turgan paneldan Settings->Compiler ni tanlaymiz. Va uni quyidagi rasmdagidek sozlab olamiz: Ok ni bosamiz. Tayyor. Dev muhitini ishlatadiganlar diqqatiga. Yuqoridagi paneldan Tools->Compiler Options ga kiramiz, bizga kompilyator sozlamalari oynasi ochiladi:
4Va rasmda ko'rsatilgan bo'limdan ISO C++ 11 ni tanlab, OK ni bosamiz, Tayyor Regex da ifodalar tuzish. Regex da belgilar to'plamini ichidan o'zimizga kerakli qismini olish uchun ifoda tuzishni o'rganib chiqishimiz kerak. Ifodani belgilar yordamida tuzamiz. Biz tuzgan ifoda o'ziga mosini o'sha belgilar to'plami ichidan topib beradi. Ifodani belgilar to'plamidan tuzamiz, o'z navbatida belgilarimiz oddiy va maxsus(metacharacter) bo'ladi. Oddiy belgilardan foydalansak, ular berilgan matn ichidan o'ziga o'xshaganlarni topib beradi. Maxsus belgilar biroz boshqacharoq ishlaydi. Biz ifodani tuzayotganda uni Raw String qilib tuzganimiz ma'qul. Nima ekanligini keyinroq tushuntirib beraman. Maqolani shu joyiga kelganda, mavzudan biroz chetga chiqib, raw string ni ozroq tushuntirib bersam, Raw string o'zi anglatib turgandek "chala" string. Uni oddiy string tipida qo'shtirnoqlarni
5boshlanishiga R harfini qo'yib hosil qilamiz, qo'shtirnoq ochilgandan keyin ochiq qavs va yopilishidan oldin yopiq qavs qo'yish shart. Keling, namuna ko'raylik: string s="Salom!\n Havo ajoyib-a?!"; string s1=R"(Salom!\n Havo ajoyib-a?!)"; cout<<s<<endl; cout<<"=====\n"; cout<<s1<<endl;Natija: Salom! Havo ajoyib-a?! ===== Salom!\n Havo ajoyib-a?! Ko'rib turganingizdek, \n da enter tashlanishi kerak edi, raw string esa shunaqa joylarini inkor qila oladi \ - bu shunchaki backslash va uni raw stringda shunchaki ishlatish mumkin, stringda backslash ni ishlatish uchun \\ yozishimiz kerak. Ifodamiz albatta regex tipida bo'lishi kerak. Ifoda yozishdan oldin ba'zi metacharacterlar(maxsus belgilar) bilan tanishib chiqsak: . - nuqta har qanday belgini topib beradi \d - har qanday raqamni topib beradi(decimal). Ushbu metacharacterga ekvivalent: [[:digit:]] \D - \d ni teskarisi, raqam bo'lmagan belgini topib beradi. Ushbu metacharacterga ekvivalent [^[:digit]] \s - bo'shliqni topadi(space, tab) \S - \s ni teskarisi. \w - alphanumeric(harf yoki raqam) va tagchiziq belgisini topadi. \W - \w ni teskarisi. + biror x belgidan keyin ushbu belgini qo'yish orqali ushbu x belgi 1 yoki ko'p marta qatnashishi kerakligini bildirgan bo'lamiz. | - or(yoki), buni biz 2 ta belgi orasiga qo'llash orqali ulardan biri kelganini aniqlashimiz mumkin bo'ladi. [belgilar to'plami] - ushbu burchakli qavslar ichida belgilar kategoriyasini kiritamiz. Ichidagi belgilardan duch kelganini topadi. Masalan, agar [abc] desak, unda a, b, yoki c belgisini topadi.