JavaRush /Java blogi /Random-UZ /RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa q...
Artur
Daraja
Tallinn

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 4-qism

Guruhda nashr etilgan
RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 1-qism RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 2-qism Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 3-qism Ushbu yakuniy qism, o'rtada, asosan, muntazam ifoda ustalari tomonidan qo'llaniladigan narsalarga to'xtalib o'tadi. Lekin oldingi qismlardagi material siz uchun oson edi, to'g'rimi? Bu shuni anglatadiki, siz ushbu materialni bir xil qulaylik bilan boshqarishingiz mumkin! Original bu yerda RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-1-qism <h2>16-qadam: qo'lga kiritmasdan guruhlar (?:)</h2> RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-2 qismOldingi bosqichdagi ikkita misolda biz haqiqatan ham kerak bo'lmagan matnni yozib oldik. Fayl oʻlchamlari vazifasida biz fayl oʻlchamlarining birinchi raqami oldidagi boʻshliqlarni, CSV topshirigʻida esa har bir token orasidagi vergullarni qoʻydik. Biz bu belgilarni suratga olishimiz shart emas, lekin biz ularni muntazam ifodani tuzish uchun ishlatishimiz kerak. Bular guruhni suratga olmasdan ishlatish uchun ideal variantlardir (?:). Qo'lga kiritmaydigan guruh o'ziga o'xshash narsani bajaradi - bu belgilarni guruhlash va oddiy iboralarda ishlatish imkonini beradi, lekin ularni raqamlangan guruhda ushlamaydi:
naqsh: (?:")([^"]+)(?:") string: Men faqat "bu tirnoq ichidagi matnni" 
xohlayman .
o'yinlar:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
guruh:                 111111111111111111111111111    
( Misol ) Oddiy ibora endi iqtibos keltirgan matnga ham, qo'shtirnoq belgilarining o'ziga ham mos keladi, lekin suratga olish guruhi faqat iqtibosli matnni yozib oldi. Nega buni qilishimiz kerak? Gap shundaki, ko'pchilik oddiy ifoda mexanizmlari sizning oddiy iboralaringizda belgilangan yozib olish guruhlaridan matnni tiklashga imkon beradi. Agar biz kerak bo'lmagan qo'shimcha belgilarni ularni suratga olish guruhlarimizga kiritmasdan qisqartira olsak, bu matnni keyinchalik tahlil qilish va boshqarishni osonlashtiradi. Oldingi bosqichdan CSV tahlilchisini qanday tozalash kerak:
naqsh: (?:^|,)\s*(?:\"([^",]*)\"|([^", ]*)) 
qator:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , "", l 
mos keladi: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
guruh:    2 1 111 2 2 111 2222 2 2    
( Misol ) Bu yerda <mark>e'tibor berish kerak bo'lgan bir nechta narsa bor:</mark> Birinchidan, biz qo'lga kiritadigan guruhni tortib (^|,)olinmaydigan guruhga o'zgartirganimiz uchun endi vergul qo'ymayapmiz (?:^|,). Ikkinchidan, biz qo'lga olish guruhini qo'lga olinmagan guruhga joylashtirdik. Bu, masalan, ma'lum bir tartibda paydo bo'lishi uchun belgilar guruhi kerak bo'lganda foydali bo'ladi, lekin siz ushbu belgilarning faqat bir qismi haqida qayg'urasiz. Bizning holatlarimizda qo'shtirnoq ichida ko'rinishi uchun bizga qo'shtirnoqsiz belgilar va vergul bo'lmagan belgilar kerak edi , lekin aslida qo'shtirnoq[^",]* belgilarining o'zi kerak emas edi, shuning uchun ularni yozib olishning hojati yo'q edi. Nihoyat, <mark>eslatma</mark>, yuqoridagi misolda kva belgilar orasida nol uzunlikdagi moslik ham bor l. Qo'shtirnoqlar ""qidirilayotgan pastki qatordir, lekin qo'shtirnoqlar orasida hech qanday belgilar mavjud emas, shuning uchun mos keladigan pastki qatorda hech qanday belgilar mavjud emas (uzunligi nolga teng). <h3>Bilimlarimizni mustahkamlaymizmi? Bunda bizga ikki yarim vazifa yordam beradi:</h3> Yozib olinmaydigan guruhlardan (guruhlarni, belgilar sinflarini va hokazolarni) foydalanib, satrda faqat toʻgʻri formatlangan fayl oʻlchamlarini saqlaydigan muntazam ifodani yozing. quyida:
naqsh:
satr:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
o'yinlar: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
guruh:    11111 1111 11111 111    
( Yechim ) HTML ochilish teglari bilan boshlanadi <va bilan tugaydi >. HTML yopish teglari belgilar ketma-ketligi bilan boshlanadi </va belgilar bilan tugaydi >. Teg nomi ushbu belgilar orasida joylashgan. Faqat quyidagi teglardagi nomlarni yozib olish uchun oddiy ifoda yoza olasizmi? (Siz bu muammoni qo'lga kiritmaydigan guruhlardan foydalanmasdan hal qilishingiz mumkin. Buni ikki yo'l bilan hal qilib ko'ring! Bir marta guruhlar bilan va bir martasiz.)
naqsh:
string:   <p> </span> <div> </kbd> <link> 
mos keladi: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
guruh:    1 1111 111 111 1111    
( Qo'lga kiritmaydigan guruhlardan foydalangan holda yechim ) ( Yozib olinmaydigan guruhlardan foydalanmasdan yechim ) <h2>17-qadam: Orqaga havolalar \Nva nomli yozib olish guruhlari</h2> RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-3-qismKirish qismida sizni HTML tahlilchisini yaratishga odatda oddiy iboralar yordamida harakat qilish haqida ogohlantirgan bo'lsam ham yurak og'rig'iga olib keladi, bu oxirgi misol ko'pchilik muntazam iboralarning boshqa (ba'zan) foydali xususiyatiga yoqimli segue: orqaga havolalar. Orqaga havolalar bir xil matnni ikki marta yozib olishga urinib ko'rishingiz mumkin bo'lgan takroriy guruhlarga o'xshaydi. Ammo ular bir muhim jihati bilan farq qiladi - ular faqat bir xil matnni, xarakter bo'yicha xarakterga ega bo'lishadi. Takroriy guruh bizga shunga o'xshash narsalarni suratga olishga imkon beradi:
naqsh: (he(?:[az])+) 
string:   heyabcdefg hey heyo heyellow heyyyyyyyyyy 
mos keladi: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ 
guruh:    1111111111 111 1111 11111111 11111111111    
( Misol ) ...keyin backlink faqat bunga mos keladi:
naqsh: (he([az])(\2+)) 
string: heyabcdefg hey heyo heyellow heyyyyyyyyyy 
mos keladi:                              ^^^^^^^^^^^ 
guruh:                                 11233333333    
( Misol ) Qayta-qayta suratga olish guruhlari bir xil naqshni qayta-qayta moslashtirishni xohlaganingizda foydali bo'ladi, bir xil matnga mos kelmoqchi bo'lsangiz, orqaga havolalar yaxshi bo'ladi. Masalan, biz HTML teglarini ochish va yopish uchun mos keladigan havoladan foydalanishimiz mumkin:
naqsh: <(\w+)[^>]*>[^<]+<\/\1> 
qator:   <span style="color: red">hey</span> 
mos keladi: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Guruh:    1111    
( Misol ) <mark>Iltimos, e'tibor bering</mark> bu juda soddalashtirilgan misol va men muntazam ifodaga asoslangan HTML tahlilchisi yozishga urinmaslikni qat'iy tavsiya qilaman. Bu juda murakkab sintaksis va sizni kasal qiladi. Nomlangan qo'lga olish guruhlari backlinksga juda o'xshaydi, shuning uchun men ularni bu erda qisqacha yoritib beraman. Qayta havolalar va nomli suratga olish guruhi o‘rtasidagi yagona farq shundaki,... nomli suratga olish guruhining nomi bor:
naqsh: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
qator:   <span style="color: red">hey< /span> 
mosliklari: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Guruh:    1111    
( Misol ) Siz (?<name>...) yoki (?'name'...) sintaksisi (.NET-mos keluvchi muntazam ifoda) yoki shu sintaksis (?P<name>) yordamida nomli yozib olish guruhini yaratishingiz mumkin. ..) yoki (?P'name'...) (Python-mos keladigan muntazam ifoda). Biz ikkala versiyani qo'llab-quvvatlaydigan PCRE (Perl Compatible Regular Expression) dan foydalanayotganimiz sababli, bu erda bittadan foydalanishimiz mumkin. (Java 7 .NET sintaksisidan ko'chirildi, lekin faqat burchakli qavslar versiyasi. Tarjimonning eslatmasi) Nomlangan yozib olish guruhini keyinchalik muntazam ifodada takrorlash uchun biz \<kname> yoki \k'name' (.NET) yoki (? P= nomi) (Python). Shunga qaramay, PCRE ushbu turli xil variantlarning barchasini qo'llab-quvvatlaydi. Siz bu yerda nomli qo'lga olish guruhlari haqida ko'proq o'qishingiz mumkin , ammo bu ular haqida bilishingiz kerak bo'lgan narsalarning aksariyati edi. <h3>Bizga yordam berish uchun topshiriq:</h3> Bu odamning ismini eslab qolishimga yordam berish uchun qayta havolalardan foydalaning... hmm...
naqsh:
string: "Salom, mening ismim Jo." [keyinroq] "Bu yigitning ismi nima? Jou ?"
o'yinlar:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
guruh:                  111    
( Yechim ) <h2>18-qadam: oldinga va orqaga qarash</h2> RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-4-qismEndi biz muntazam iboralarning ayrim ilg'or xususiyatlariga to'xtalib o'tamiz. Men 16-bosqichgacha hamma narsani tez-tez ishlataman. Ammo bu so'nggi bir necha qadamlar faqat regexni juda murakkab ifodalarni moslashtirish uchun juda jiddiy ishlatadigan odamlar uchundir. Boshqacha aytganda, muntazam iboralar ustalari. "Oldinga qarash" va "Orqaga qarash" juda murakkab tuyulishi mumkin, ammo ular juda murakkab emas. Ular sizga avvalroq qo‘lga kiritilmagan guruhlar bilan qilgan ishimizga o‘xshash ishni bajarishga imkon beradi - biz mos kelmoqchi bo‘lgan haqiqiy matndan darhol oldin yoki undan keyin matn mavjudligini tekshiring. Misol uchun, biz faqat odamlarga yoqadigan narsalarning nomlarini moslashtirmoqchimiz deylik, lekin ular bunga ishtiyoq bilan qarashsa (faqat ular gapni undov belgisi bilan tugatsa). Biz shunday qilishimiz mumkin:
naqsh: (\w+)(?=!) 
string: Menga stol yoqadi. Men staplerni qadrlayman. Men chiroqni yaxshi ko'raman !
o'yinlar:                                           ^^^^ 
guruh:                                              1111    
( Misol(\w+) ) Yuqoridagi tasvirlash guruhi , odatda parchadagi har qanday so'z bilan mos keladigan faqat chiroq so'ziga qanday mos kelishini ko'rishingiz mumkin . Oldinga ijobiy qarash (?=!)degani, biz faqat shu bilan tugaydigan ketma-ketlikni moslashimiz mumkin !, lekin undov belgisining o'ziga mos kelmasligimizni anglatadi. Bu muhim farq, chunki qo'lga kiritmaydigan guruhlar bilan biz xarakterga mos kelamiz, lekin uni ushlamaymiz. Oldinga qarash va orqaga qarash bilan biz odatiy ifodani yaratish uchun belgidan foydalanamiz, lekin keyin biz uni o'zimizga ham mos kelmaymiz. Biz buni keyinroq muntazam ifodada moslashimiz mumkin. Oldinga qarash va orqaga qarashning to'rt turi mavjud: ijobiy qarash (?=...), salbiy (?!...), ijobiy (?<=...) va salbiy (?<!. ..) . Ular o'zlariga o'xshagan narsani qilishadi - ijobiy qarash va orqaga qarash oddiy iboralar mexanizmiga faqat oldinga qarash/orqaga qarashdagi matn haqiqatda mos kelganda moslashishni davom ettirish imkonini beradi. Salbiy qarash va orqaga qarash teskarisini amalga oshiradi - ular regexni faqat oldinga qarash/orqaga qarashdagi matn mos kelmasa, mos kelishiga imkon beradi. Misol uchun, biz usul nomlarini ular ishlaydigan ob'ektga emas, balki faqat usullar ketma-ketligi zanjiriga moslashtirishni xohlaymiz. Bunday holda, har bir usul nomidan oldin .. Oddiy ibora bu erda yordam berishi mumkin:
naqsh: (?<=\.)(\w+) 
string: myArray. flatMap.aggregate.summarise.print !
o'yinlar:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
guruh:            1111111 111111111 111111111 11111    
( Misol ) Yuqoridagi matnda biz so'z belgilarining har qanday ketma-ketligiga mos kelamiz \w+, lekin faqat ular oldidan belgi bo'lsa .. Biz qo'lga kiritmaydigan guruhlar yordamida shunga o'xshash narsaga erishishimiz mumkin, ammo natija biroz chalkashroq:
naqsh: (?:\.)(\w+) 
string: myArray .flatMap.aggregate.summarise.print !
o'yinlar:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
guruh:            1111111 111111111 111111111 11111    
( Misol ) U qisqaroq bo'lsa ham, u bizga kerak bo'lmagan belgilarga mos keladi. Garchi bu misol ahamiyatsiz bo'lib tuyulsa-da, oldinga qarash va orqaga qarash oddiy iboralarimizni tozalashga yordam beradi. <h3>Mariga juda oz qoldi! Quyidagi 2 ta vazifa bizni unga 1 qadam yaqinlashtiradi:</h3> Salbiy qarash (?<!...) oddiy ifoda mexanizmiga faqat salbiy lookbehind ichidagi matn boʻlmasa, moslikni topishda davom etish imkonini beradi. matnning qolgan qismiga qadar ko'rsatiladi, bu bilan siz moslikni topishingiz kerak. Misol uchun, biz konferentsiyaga tashrif buyurgan ayollarning familiyasiga mos keladigan oddiy iboradan foydalanishimiz mumkin. Buning uchun biz shaxsning familiyasi oldida Mr.. Buning uchun muntazam ifoda yoza olasizmi? (Familiyalar kamida to'rtta belgidan iborat deb taxmin qilish mumkin.)
naqsh:
qator: janob. Braun, xonim. Smit , missis Jons , Miss Daisy , janob. Yashil
o'yinlar:                ^^^^^ ^^^^^ ^^^^^ 
guruh:                   11111 11111 11111    
( Yechim ) Aytaylik, biz maʼlumotlar bazasini tozalayapmiz va bizda foizlarni ifodalovchi maʼlumotlar ustuni bor. Afsuski, ba'zi odamlar raqamlarni [0,0, 1,0] oralig'ida o'nlik qiymatlar sifatida yozishgan, boshqalari esa [0,0%, 100,0%] diapazonda foizlarni yozishgan, uchinchisi esa foiz qiymatlarini yozishgan, ammo to'liq foiz belgisini unutgan %. Salbiy ko'rinishdan (?!...) foydalanib, faqat foiz bo'lishi kerak bo'lgan, ammo raqamlar etishmayotgan qiymatlarni belgilashingiz mumkinmi %? Bu qiymatlar qat'iy ravishda 1,00 dan katta bo'lishi kerak, lekin orqada qolmagan holda %. (Hech bir raqam kasrdan oldin yoki keyin ikkitadan ortiq raqamni o'z ichiga olmaydi.) <mark>Eslatma</mark>, bu yechim juda qiyin . Agar siz mening javobimga qaramasdan bu muammoni hal qila olsangiz, unda sizda oddiy iboralar bo'yicha katta ko'nikmalaringiz bor!
naqsh:
satr: 0,32 100,00 5,6 0,27 98% 12,2% 1,01 0,99% 0,99 13,13 1,10 
moslik:      ^^^^^^ ^^^ ^^^^ ^^^^^ ^^^^ 
guruh:         111111 111 1111111111    
( Yechim ) <h2>19-qadam: Muntazam iboralardagi shartlar</h2> RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-5-qismEndi biz ko'pchilik oddiy iboralarni ishlatmaydigan darajaga yetdik. Biz oddiy oddiy iboralar uchun foydalanish holatlarining 95 foizini ko‘rib chiqdik va 19 va 20-bosqichlarda bajarilgan barcha ishlar odatda awk yoki sed (yoki umumiy maqsadli dasturlash tili) kabi to‘liq xususiyatli matnni manipulyatsiya qilish tili bilan amalga oshiriladi. Shunday qilib, keling, davom etaylik, shuning uchun oddiy ibora haqiqatan ham nima qilishini bilasiz. Muntazam iboralar Turing to'liq bo'lmasa- da , ba'zi muntazam ifoda dvigatellari to'liq dasturlash tiliga juda o'xshash xususiyatlarni taklif qiladi. Ana shunday xususiyatlardan biri “shart”dir. Regex shartlari, agar-then-else iboralariga ruxsat beradi, bunda tanlangan filial biz oldingi bosqichda bilib olgan "oldinga qarash" yoki "orqaga qarash" bilan belgilanadi. Misol uchun, sanalar ro'yxatida faqat joriy yozuvlarni moslashtirishni xohlashingiz mumkin:
naqsh: (?<=Fevral )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
qator: Ishlagan sanalar : 28 fevral , 29 fevral , 30 fevral, 30 mart, 31 mart  
o'yinlari:                   ^^ ^^ ^^ ^^ 
guruh:                      11 11 22 22    
( Misol ) <mark>Eslatma</mark>, yuqoridagi guruhlar ham oylar bo'yicha indekslanadi. Biz barcha 12 oy uchun oddiy iborani yozishimiz va faqat joriy sanalarni yozib olishimiz mumkin, keyinchalik ular yil oyi bo'yicha indekslangan guruhlarga birlashtiriladi. Yuqorida "fevral" raqamdan oldin bo'lsa (va shunga o'xshash ikkinchisi uchun) birinchi guruhdagi mosliklarni qidiradigan if-o'xshash strukturadan foydalanadi. Ammo biz faqat fevral uchun maxsus ishlov berishdan foydalanmoqchi bo'lsak-chi? "Agar raqamdan oldin "Feb" bo'lsa, buni bajaring, aks holda boshqa ishni bajaring." Shartli shartlar buni qanday amalga oshiradi:
naqsh: (?(?<=Fevral )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
qator: Ishlagan sanalari: 28- fevral , 29 fevral , 30 fevral, 30 mart , 31 mart  
o'yinlari:                   ^^ ^^ ^^ ^^ 
guruh:                      11 11 22 22    
( Misol ) If-then-else tuzilishi (?(If)then|else) kabi ko'rinadi, bu erda (if) "oldinga qarash" yoki "orqaga qarash" bilan almashtiriladi. Yuqoridagi misolda (agar) sifatida yoziladi (?<=Feb). Ko'rish mumkinki, biz 29 dan katta sanalarni moslashtirdik, lekin ular "fevral" ga rioya qilmagan taqdirdagina. Shartli iboralarda "backhinds" dan foydalanish, agar moslikdan oldin biron bir matn mavjudligiga ishonch hosil qilishni istasangiz foydali bo'ladi. Ijobiy qarash shartlari chalkash bo'lishi mumkin, chunki shartning o'zi hech qanday matnga mos kelmaydi. Shunday qilib, agar siz if sharti hech qachon qiymatga ega bo'lishini istasangiz, u quyidagi kabi oldinga qarashga qiyoslanishi kerak:
naqsh: (?(?=aniq)aniq|else)wo 
string: exact else aniq yana ikkita  
moslik:            ^^^^^^^^^^^^^
( Misol ) Demak, ijobiy qarash shartlari foydasiz. Siz o'sha matn oldinda yoki yo'qligini tekshirib ko'ring va keyin unga mos keladigan naqshni taqdim eting. Shartli ifoda bizga bu erda umuman yordam bermaydi. Bundan tashqari, yuqoridagini oddiyroq oddiy ifoda bilan almashtirishingiz mumkin:
naqsh: (?:exact|else)wo 
string: exact else aniq ikkita boshqa  
moslik:            ^^^^^^^^^^^^^
( Misol ) Demak, shartli iboralar uchun asosiy qoida: test, test va yana test. Aks holda, siz aniq deb hisoblagan yechimlar eng hayajonli va kutilmagan tarzda barbod bo‘ladi :) <h3>Mana bizni yakuniy, 20-bosqichdan ajratib turadigan oxirgi vazifalar blokiga keldik:</h3> Muntazam iborani yozing. keyingi so'z bosh harf bilan boshlanishini tekshirish uchun salbiy qarash shartli ifodasidan foydalanadi. Agar shunday bo'lsa, faqat bitta bosh harfni, keyin esa kichik harflarni oling. Agar shunday bo'lmasa, har qanday so'z belgilarini oling.
naqsh:
string:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
o'yinlari    
: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^^^ 22222 22222 11111 222222 111111111 222 111    
( Yechim ) Agar matn oldidan matn bo'lmasa , matnni faqat matndan oldin bo'lsa , yozib oladigan shartli ownsiborani orqasida salbiy ko'rinishda yozing . (Biroz o'ylab topilgan misol, lekin nima qila olasiz ...) cloudscl
naqsh:
string: Bu masxarabozlar ba'zi klounlarga ega . udlar.
mos keladi:              ^^^^ ^^^^   
( Yechim ) <h2>20-qadam: Rekursiya va keyingi tadqiq</h2> RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  4-6-qismAslida, har qanday mavzuga 20 bosqichli kirish qismiga siqib qoʻyish mumkin boʻlgan koʻp narsa bor va muntazam iboralar bundan mustasno emas. Internetda topish mumkin bo'lgan muntazam iboralar uchun juda ko'p turli xil ilovalar va standartlar mavjud . Agar siz ko'proq ma'lumotga ega bo'lishni istasangiz, ajoyib düzenliexpressions.info saytini ko'rib chiqishingizni maslahat beraman , bu ajoyib ma'lumotnoma va men u erdan muntazam iboralar haqida ko'p narsalarni bilib oldim. Men buni juda tavsiya qilaman, shuningdek, ijodlaringizni sinab ko'rish va nashr qilish uchun regex101.com . Ushbu yakuniy bosqichda men sizga oddiy iboralar, ya'ni rekursiv iboralarni yozish haqida biroz ko'proq ma'lumot beraman. Oddiy rekursiyalar juda oddiy, ammo keling, bu oddiy ibora kontekstida nimani anglatishini o'ylab ko'raylik. Oddiy ifodadagi oddiy rekursiya sintaksisi quyidagicha yoziladi: (?R)?. Lekin, albatta, bu sintaksis ifodaning o'zida paydo bo'lishi kerak. Biz qiladigan narsa iborani o'z ichiga joylashtiramiz, o'zboshimchalik bilan bir necha marta. Masalan:
naqsh: (hey(?R)?oh) 
string:   heyoh heyyoh heyheyohoh hey oh heyhey hey heyheyohoh  
mos keladi: ^^^^^ ^^^^^^^^^^^^^^^^^^^^ 
guruh:    11111 1111111111 1111111111    
( Misol ) Ichki ifoda ixtiyoriy bo'lgani uchun ( (?R)ergashiladi ?), eng oddiy moslik rekursiyani butunlay e'tiborsiz qoldirishdir. Shunday qilib, hey, va keyin ohmos keladi ( heyoh). Bundan murakkabroq ifodani moslashtirish uchun biz ketma-ketlikni kiritgan iboraning nuqtasida o'ziga mos keladigan pastki qatorni topishimiz kerak (?R). Boshqacha qilib aytganda, biz heyheyohoh yoki heyheyohohoh va hokazolarni topishimiz mumkin edi. Ushbu ichki o'rnatilgan iboralarning ajoyib jihatlaridan biri shundaki, orqaga havolalar va nomli yozib olish guruhlaridan farqli o'laroq, ular sizni avval mos kelgan aniq matn bilan cheklamaydi. Masalan:
naqsh: ([Hh][Ee][Yy](?R)?oh) 
string:   heyoh heyyoh hEyHeYohoh hey oh heyhey hEyHeYHEyohohoh  
mos keladi: ^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^ 
guruh:    11111 1111111111 11111111111111    
( Misol ) Tasavvur qilishingiz mumkinki, oddiy iboralar mexanizmi tom ma'noda sizning oddiy iborangizni o'z ixtiyori bilan bir necha marta nusxa ko'chiradi va o'ziga joylaydi. Albatta, bu ba'zida siz kutgan narsaga erisha olmasligini anglatadi:
naqsh: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
string: (* izoh (* ichki *) emas *)
o'yinlar:            ^^^^^^^^^^^^ 
guruh:               111111111111    
( Misol ) Nima uchun bu regex tashqi izohni emas, balki faqat ichki izohni olganini ayta olasizmi? Bir narsa aniq: murakkab muntazam iboralarni yozayotganda ularni har doim sinab ko'ring va ular siz o'ylagandek ishlashiga ishonch hosil qiling. Muntazam iboralar yo'llari bo'ylab bu yuqori tezlikda o'tkazilgan miting o'z nihoyasiga yetdi. Umid qilamanki, bu sayohat sizga yoqdi. Va nihoyat, men boshida va'da qilganimdek, materialni chuqurroq o'rganish uchun bir nechta foydali havolalarni qoldiraman:
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION