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. 3-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: Ushbu qismda biz biroz murakkabroq narsalarga o'tamiz. Ammo ularni o'zlashtirish, avvalgidek, qiyin bo'lmaydi. Takror aytamanki, RegEx aslida birinchi qarashda ko'rinadiganidan osonroq va uni o'zlashtirish va uni amalda qo'llashni boshlash uchun raketa olimi bo'lish shart emas. Ushbu maqolaning inglizcha asl nusxasi bu yerda . Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-1-qism

11-qadam: Qavslar ()guruhlarni olish kabi

Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-2 qismOxirgi masalada biz har xil turdagi butun son qiymatlari va suzuvchi nuqta (nuqta) raqamli qiymatlarini qidirdik. Ammo muntazam ifoda mexanizmi bu ikki turdagi qiymatlar o'rtasida farq qilmadi, chunki hamma narsa bitta katta muntazam ifodada olingan. Agar biz mini-naqshlarni qavs ichiga kiritsak, oddiy ifoda mexanizmiga turli xil moslik turlarini farqlashini aytishimiz mumkin:
naqsh: ([AZ])|([az]) 
qator:   Boliviyaning amaldagi prezidenti Evo Moralesdir .
oʻyinlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Guruh:    122 2222222 122222222 22 1222222 22 122 1222222  
( Misol ) Yuqoridagi oddiy ibora 1 dan boshlab indekslangan ikkita suratga olish guruhini belgilaydi. Birinchi suratga olish guruhi har qanday bitta bosh harfga, ikkinchi suratga olish guruhi esa har qanday bitta kichik harfga mos keladi. |"Yoki" belgisi va qavslarni qo'lga olish guruhi sifatida ishlatib (), biz bir nechta turdagi satrlarga mos keladigan bitta muntazam ifodani aniqlashimiz mumkin. Agar biz buni maqolaning oldingi qismidagi uzoq/float qidiruv regeximizga qo'llasak, u holda regex mexanizmi tegishli guruhlardagi mos mosliklarni oladi. Pastki satr qaysi guruhga mos kelishini tekshirish orqali biz uning float yoki uzun qiymat ekanligini darhol aniqlashimiz mumkin:
naqsh: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 
qator:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0.
o'yinlar: ^^^ ^^^^ ^^ ^^ ^^^ 
guruh:    222 1111 22 11 111  
( Misol ) Bu muntazam ibora ancha murakkab va uni yaxshiroq tushunish uchun keling, uni parchalab, ushbu naqshlarning har birini ko'rib chiqamiz:
( // har qanday "float" pastki qatoriga mos keladi
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //OR
( // har qanday "uzun" pastki qatorga mos keladi
  \d+[lL]
)
Qavslar ichidagi belgi |va yozish guruhlari ()har xil turdagi pastki qatorlarni moslashtirishga imkon beradi. Bunday holda, biz "suzuvchi" suzuvchi nuqta raqamlari yoki "uzun" uzun butun sonlarni moslashtiramiz.
(
  \d*\.\d+[fF] // Kasrning oʻng tomonida 1+ ta raqam
  |
  \d+\.\d*[fF] // Kasrning chap tomonida 1+ ta raqam
  |
  \d+[fF] // nuqta yo'q, faqat 1+ raqam
)
|
(
  \d+[lL] // nuqta yo'q, faqat 1+ raqam
)
"Float" ta'qib qilish guruhida bizda uchta variant mavjud: o'nli kasrning o'ng tomonida kamida 1 ta raqam bo'lgan raqamlar, o'nli kasrning chap tomonida kamida 1 raqam bo'lgan raqamlar va kasrsiz raqamlar. Ularning har biri oxiriga "f" yoki "F" harflari qo'shilsa, "suzuvchi" hisoblanadi. "Uzoq" suratga olish guruhida bizda faqat bitta variant bor - bizda "l" yoki "L" belgilaridan keyin 1 yoki undan ortiq raqam bo'lishi kerak. Muntazam ifoda mexanizmi ma'lum bir satrda ushbu pastki qatorlarni qidiradi va ularni tegishli suratga olish guruhida indekslaydi. EslatmaBiz ularga "l", "L", "f" yoki "F" qo'shilmagan raqamlarning hech biriga mos kelmayapmiz. Bu raqamlarni qanday tasniflash kerak? Xo'sh, agar ular o'nli nuqtaga ega bo'lsa, Java tili sukut bo'yicha "ikki martalik" bo'ladi. Aks holda ular "int" bo'lishi kerak.

Keling, o'rganganlarimizni bir nechta jumboq bilan mustahkamlaymiz:

Yuqoridagi regexga yana ikkita ta'qib qilish guruhini qo'shing, shunda u double yoki int raqamlarini tasniflaydi. (Bu yana bir qiyin savol, agar u biroz vaqt talab qilsa, tushkunlikka tushmang, oxirgi chora sifatida mening yechimimni ko'ring.)
naqsh:
satr:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
mos keladi: ^^^ ^^^^^^ ^^ ^^^ ^^ ^^^ ^^ 
guruh:    333 44 1111 33 222 11 111 22
( Yechim ) Keyingi masala biroz soddaroq. Quyidagi yoshni saralash uchun qavs ichidagi suratga olish guruhlari (), "yoki" belgisi |va belgilar diapazonidan foydalaning: "AQShda ichish mumkin". (>= 21) va "AQShda ichish taqiqlangan" (<21):
naqsh:
satr:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
oʻyin: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
guruh:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Yechim )

12-qadam: Avval aniqroq mosliklarni aniqlang

Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-3 qismAgar siz "qonuniy ichuvchilar" ni ikkinchi guruh emas, balki birinchi qo'lga olish guruhi sifatida belgilashga harakat qilsangiz, oxirgi vazifani bajarishda muammolarga duch kelgan bo'lishingiz mumkin. Buning sababini tushunish uchun keling, boshqa misolni ko'rib chiqaylik. Faraz qilaylik, biz 4 tadan kam belgidan iborat familiyalarni va 4 yoki undan ortiq belgidan iborat familiyalarni alohida qayd qilmoqchimiz. Keling, birinchi qo'lga olish guruhiga qisqaroq nomlar beramiz va nima sodir bo'lishini ko'ramiz:
naqsh: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
string:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
o'yinlar: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
guruh:    111 111 11 111 111 111 111   
( Misol ) Odatiy bo'lib, ko'pchilik oddiy ifoda dvigatellari biz hozirgacha ko'rgan asosiy belgilarga nisbatan ochko'z moslashuvdan foydalanadi. Bu shuni anglatadiki, muntazam ifoda mexanizmi taqdim etilgan muntazam ifodada imkon qadar erta aniqlangan eng uzun guruhni oladi. Shunday qilib, yuqoridagi ikkinchi guruh, masalan, "Jobs" va "Cloyd" kabi nomlardagi ko'proq belgilarni qo'lga kiritishi mumkin bo'lsa-da, lekin bu nomlarning dastlabki uchta belgisi allaqachon birinchi qo'lga olish guruhi tomonidan qo'lga kiritilganligi sababli, ularni ikkinchi guruh tomonidan qo'lga kiritib bo'lmaydi. . Keling, kichik bir tuzatish kiritamiz - avvalroq aniqroq (uzunroq) guruhni qo'yib, qo'lga olish guruhlari tartibini o'zgartiring:
naqsh: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mosliklar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
guruh:    222 1111 22 11111 1111 222 1111    
( Misol )

Vazifa... bu safar faqat bitta :)

"Aniqroq" naqsh deyarli har doim "uzoqroq" degan ma'noni anglatadi. Aytaylik, biz ikki xil “so‘z”ni topmoqchimiz: birinchi navbatda unlilar bilan boshlanganlar (aniqrog‘i), keyin unlilar bilan boshlanmaydiganlar (boshqa so‘zlar). Ushbu ikki guruhga mos keladigan satrlarni olish va aniqlash uchun muntazam ifoda yozishga harakat qiling. (Quyidagi guruhlar raqamlangan emas, balki harflar bilan yozilgan. Qaysi guruh birinchisiga, qaysi biri ikkinchisiga mos kelishi kerakligini aniqlashingiz kerak.)
naqsh:
string:   pds6f uub 24r2gp ewqrty l ui_op 
mos keladi: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^^^^^ 
guruh:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Yechim ) Umuman olganda, sizning muntazam ifodangiz qanchalik aniq bo'lsa, u shunchalik uzoq davom etadi. Va qanchalik aniq bo'lsa, sizga kerak bo'lmagan narsani qo'lga kiritish ehtimoli shunchalik kam bo'ladi. Shunday qilib, ular qo'rqinchli ko'rinishi mumkin bo'lsa-da, uzunroq regexlar ~= yaxshi regexlar. Afsuski .

{}13-qadam: Muayyan miqdordagi takrorlash uchun jingalak qavslar

Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-4 qismOldingi bosqichdagi familiyalar bilan misolda bizda bitta naqshda deyarli takrorlanadigan ikkita guruh bor edi:
naqsh: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mosliklar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
guruh:    222 1111 22 11111 1111 222 1111    
Birinchi guruh uchun bizga to'rt yoki undan ortiq harfli familiyalar kerak edi. Ikkinchi guruh uch yoki undan kam harfli familiyalarni olishlari kerak edi. [a-z]Bu guruhlarni qayta-qayta takrorlashdan ko'ra buni yozishning oson yo'li bormi ? Buning uchun jingalak qavslardan foydalansangiz mavjud {}. Jingalak qavslar {}oldingi belgi yoki suratga olish guruhiga mos keladigan minimal va (ixtiyoriy) maksimal sonini belgilashga imkon beradi. Foydalanishning uchta holati mavjud {}:
{X} // aynan X marta mos keladi
{X,} // mos keladi >= X marta
{X,Y} // >= X va <= Y marta mos keladi
Mana bu uch xil sintaksisga misollar:
naqsh: [az]{11} 
string:   humuhumunuk unukuapua'a.
mos keladi: ^^^^^^^^^^^   
( Misol )
naqsh: [az]{18,} 
satr:   humuhumunukunukuapua 'a.
mos keladi: ^^^^^^^^^^^^^^^^^^^^^^^    
( Misol )
naqsh: [az]{11,18} 
string:   humuhumunukunukuap ua'a.
mosliklar: ^^^^^^^^^^^^^^^^^^^^    
( Misol ) Yuqoridagi misollarda e'tiborga olish kerak bo'lgan bir nechta fikrlar mavjud.etibor bering:. Birinchidan, {X} belgisidan foydalanib, oldingi belgi yoki guruh aynan shu raqamga (X) mos keladi. Agar "so'z"da (X raqamidan ko'ra) naqshga mos keladigan belgilar ko'proq bo'lsa (birinchi misolda ko'rsatilganidek), u holda ular o'yinga kiritilmaydi. Agar belgilar soni X dan kam bo'lsa, to'liq moslik muvaffaqiyatsiz tugaydi (birinchi misolda 11 dan 99 gacha o'zgartirishga harakat qiling). Ikkinchidan, {X,} va {X,Y} yozuvlari ochko'zdir. Ular berilgan muntazam ifodani qondirgan holda, iloji boricha ko'proq belgilarni moslashtirishga harakat qilishadi. Agar siz {3,7} ni belgilasangiz, 3 dan 7 gacha belgilar mos kelishi mumkin va agar keyingi 7 ta belgi to'g'ri bo'lsa, barcha 7 ta belgi mos keladi. Agar siz {1,} ni belgilasangiz va keyingi 14 000 ta belgining barchasi mos kelsa, bu belgilarning hammasi mos keladigan qatorga kiritiladi. Yuqoridagi iborani qayta yozish uchun ushbu bilimdan qanday foydalanishimiz mumkin? [a-z]Eng oddiy yaxshilanish qo'shni guruhlarni bilan almashtirish bo'lishi mumkin [a-z]{N}, bu erda N mos ravishda tanlanadi:
naqsh: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...lekin bu vaziyatni yaxshilamaydi. Birinchi qo'lga olish guruhiga qarang: bizda [a-z]{2}(to'liq 2 ta kichik harfga to'g'ri keladi) keyin [a-z]+(1 yoki undan ortiq kichik harflar mos keladi). Buni jingalak qavslar yordamida 3 yoki undan ortiq kichik harflarni so'rash orqali soddalashtirishimiz mumkin:
naqsh: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Ikkinchi qo'lga olish guruhi boshqacha. Ushbu familiyalarda bizga uchta belgidan oshmasligi kerak, ya'ni bizda yuqori chegara bor, lekin pastki chegaramiz nolga teng:
naqsh: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Muntazam iboralarni qo'llashda o'ziga xoslik har doim yaxshi bo'ladi, shuning uchun u erda to'xtash oqilona bo'lardi, lekin men bu ikki belgi diapazoni ( [AZ]va [az]) bir-birining yonidagi "so'z belgisi" sinfiga o'xshab ko'rinishini sezmay qololmayman, \w( [A-Za-z0-9_]) . Agar bizning ma'lumotlarimizda faqat yaxshi formatlangan familiyalar mavjudligiga ishonchimiz komil bo'lsa, biz oddiy ifodani soddalashtirib, oddiygina yozishimiz mumkin edi:
naqsh: (\w{4,})|(\w{1,3}) 
Birinchi guruh har qanday ketma-ketlikni 4 yoki undan ortiq "so'z belgilari" ( [A-Za-z0-9_]), ikkinchi guruh esa 1 dan 3 gacha bo'lgan "so'z belgilari" (shu jumladan) bo'lgan har qanday ketma-ketlikni ushlaydi. Bu ishlaydimi?
naqsh: (\w{4,})|(\w{1,3}) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mosliklar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
guruh:    222 1111 22 11111 1111 222 1111    
( Misol ) Ishladi! Bu yondashuv haqida nima deyish mumkin? Va bu avvalgi misolimizga qaraganda ancha toza. Birinchi suratga olish guruhi to'rt yoki undan ortiq belgilarga ega barcha familiyalarga mos kelganligi sababli, biz ikkinchi qo'lga olish guruhini oddiy ga o'zgartirishimiz mumkin \w+, chunki bu bizga qolgan barcha familiyalarni (1, 2 yoki 3 ta belgi bilan) olish imkonini beradi:
naqsh: (\w{4,})|(\w+) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mosliklar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
guruh:    222 1111 22 11111 1111 222 1111    
( Misol )

Keling, miyaga buni o'rganishga va quyidagi 2 muammoni hal qilishga yordam beraylik:

{}7-qadamdan boshlab ijtimoiy xavfsizlik raqamini qidirishning muntazam ifodasini qayta yozish uchun jingalak qavslardan foydalaning :
naqsh:
qator: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
mos keladi:              ^^^^^^^^^^^
( Yechim ) Tasavvur qiling, veb-saytning parol kuchini tekshirgich foydalanuvchi parollarini 6 dan 12 tagacha belgidan iborat bo'lishini talab qiladi. Quyidagi roʻyxatdagi notoʻgʻri parollarni belgilovchi oddiy iborani yozing . Har bir parol oson moslashish uchun qavslar ichida joylashgan (), shuning uchun oddiy ibora harfiy (va )ramziy belgilar bilan boshlanib, tugashiga ishonch hosil qiling. Maslahat: parollarda so'zma-so'z qavslarga [^()]yoki shunga o'xshash parollarga ruxsat bermasligingizga ishonch hosil qiling, aks holda siz butun qatorga mos kelasiz!
naqsh:
string:   (12345) (mening parolim) (Xanadu.2112) (su_do) (OfSalesmen!)
mos keladi: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Yechim )

14-qadam: \bnol kenglik chegarasi belgisi

Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-5 qismOxirgi vazifa juda qiyin edi. ""Qavslar o'rniga parollarni qo'shtirnoq ichiga qo'yib, buni biroz murakkablashtirsak-chi ()? Qavs ichidagi barcha belgilarni tirnoq belgilari bilan almashtirish orqali shunga o'xshash echimni yoza olamizmi?
naqsh: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
string:   "12345" "mening parolim" "Xanadu.2112 " " su_do" " OfSalesmen! "
mos keladi: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Misol ) Bu unchalik ta'sirli bo'lmadi. Buning sababini allaqachon taxmin qildingizmi? Muammo shundaki, biz bu erda noto'g'ri parollarni qidirmoqdamiz. "Xanadu.2112" - yaxshi parol, shuning uchun regex bu ketma-ketlikda bo'shliqlar yoki harflar belgilari yo'qligini tushunganida , u o'ng tomondagi parolni tasdiqlovchi "belgidan oldin chiqadi . "(Chunki biz parollar ichidan belgilarni "topib boʻlmasligini koʻrsatdik [^"].) Oddiy ifoda mexanizmi bu belgilarning maʼlum bir oddiy iboraga mos kelmasligiga ishonch hosil qilgandan soʻng, u toʻxtagan joyidan – belgi turgan joyidan qayta ishlaydi ". Xanadu.2112" o'ngda. U erdan u bitta kosmik belgini va boshqa belgini ko'radi "- uning uchun bu noto'g'ri parol! Asosan, u bu ketma-ketlikni topadi " "va davom etadi. Bu biz olishni istagan narsa emas... Parolning birinchi belgisi bo'sh joy bo'lmasligini aniqlab olsak, juda yaxshi bo'lardi. Buni qilishning bir yo'li bormi? (Hozirga kelib, siz mening barcha ritorik savollarimga javob “ha” ekanligini tushungandirsiz.) Ha! Bunday yo'l bor! Ko'pgina muntazam ifoda dvigatellari "so'z chegarasi" kabi qochish ketma-ketligini ta'minlaydi \b. "So'z chegarasi" \b- bu nol kenglikdagi qochish ketma-ketligi, g'alati darajada, so'z chegarasiga mos keladi. Esda tutingki, "so'z" deganda biz sinfdagi har qanday belgilar ketma-ketligini \wyoki [A-Za-z0-9_]. So'z chegarasining mos kelishi ketma-ketlikdan oldingi yoki darhol keyingi belgi so'z belgisi \bbo'lishi kerakligini anglatadi. неBiroq, mos kelganda, biz ushbu belgini olingan pastki qatorga kiritmaymiz. Bu nol kenglik. Bu qanday ishlashini ko'rish uchun keling, kichik bir misolni ko'rib chiqaylik:
naqsh: \b[^ ]+\b 
string:   Ve still vant ze money , Lebowski .
mos keladi: ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  
( Misol ) Ketma-ketlik [^ ]bo'sh joy belgisi bo'lmagan har qanday belgiga mos kelishi kerak. ,Xo'sh, nega bu vergul puldan keyingi vergul yoki Lebowskidan keyingi nuqtaga to'g'ri kelmaydi .? Buning sababi, vergul ,va nuqta .so'z belgilari emas, shuning uchun so'z belgilari va so'z bo'lmagan belgilar o'rtasida chegaralar yaratilgan. Ular yso'z oxirida paydo bo'ladi. pul so'zi va ,undan keyingi vergul . va " iLebowski so'zi va undan keyingi nuqta .(nuqta/nuqta) o'rtasida. Muntazam ibora ushbu so'zlarning chegaralariga mos keladi (lekin ularni aniqlashga yordam beradigan so'z bo'lmagan belgilarda emas). \bAmmo shablonimizga izchillikni kiritmasak nima bo'ladi ?
naqsh: [^ ]+ 
string:   Ve hali vant ze pul, Lebowski. 
mos keladi: ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  
( Misol ) Ha, endi biz bu tinish belgilarini ham topamiz. Keling, kotirovka qilingan parollar uchun regexni tuzatish uchun so'z chegaralaridan foydalanamiz:
naqsh: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\" 
string:   "12345" "mening parolim" " Xanadu. 2112" "su_do" "Sotuvchidan tashqari!"
mos keladi: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Misol ) Qo'shtirnoq ("\b ... \b") ichiga so'z chegaralarini qo'yish orqali biz mos keladigan parollarning birinchi va oxirgi belgilari "so'z belgilari" bo'lishi kerakligini samarali aytamiz. Shunday qilib, bu erda yaxshi ishlaydi, lekin foydalanuvchi parolining birinchi yoki oxirgi belgisi so'z belgisi bo'lmasa ham ishlamaydi:
naqsh: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\"
string: "quyidagi parolni belgilash" "C++"
mos keladi:   
( Misol ) Ikkinchi parol juda qisqa bo'lsa ham, qanday qilib "yaroqsiz" deb belgilanmaganiga qarang. Siz bo'lishingiz kerakehtiyotkorketma-ketliklar bilan \b, chunki ular faqat belgilar orasidagi chegaralarga mos keladi \wva emas \w. Yuqoridagi misolda biz belgilarga ruxsat bermaganimiz sababli, parollarda parolning birinchi/oxirgi belgisi \worasidagi chegara soʻz chegarasi boʻlishi kafolatlanmaydi . \\b

Ushbu bosqichni bajarish uchun biz faqat bitta oddiy masalani hal qilamiz:

So'z chegaralari, biz belgilarning ma'lum bir ketma-ketligiga mos kelmoqchi bo'lsak, lekin ular faqat so'z boshida yoki oxirida (yoki o'z-o'zidan) mavjudligiga ishonch hosil qilishni istasak, sintaksisni ajratib ko'rsatish mexanizmlarida foydalidir. Aytaylik, biz sintaksisni ajratib ko'rsatishni yozyapmiz va var so'zini ajratib ko'rsatishni xohlaymiz, lekin u o'z-o'zidan paydo bo'lganda (so'zdagi boshqa belgilarga tegmasdan). Buning uchun muntazam ifoda yoza olasizmi? Albatta qila olasiz, bu juda oddiy vazifa;)
naqsh:
string:   var varx _var ( var j) barvarcar * var var -> { var }
mos keladi: ^^^ ^^^ ^^^ ^^^ ^^^  
( Yechim )

15-qadam: " ^chiziq boshi" sifatida "karet" va $"satr oxiri" sifatida dollar belgisi

Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  3-6-qismSo'z chegarasi ketma-ketligi \b(maqolaning oldingi qismining oxirgi bosqichidan) muntazam iboralarda foydalanish uchun mavjud bo'lgan yagona maxsus nol kenglikdagi ketma-ketlik emas. Ikkita eng mashhurlari "karet" ^- "chiziqning boshi" va dollar belgisi $- "chiziq oxiri". Ulardan birini muntazam iboralaringizga kiritish, moslik manba qatorining boshida yoki oxirida paydo bo'lishi kerakligini anglatadi:
naqsh: ^start|end$ 
string:   start end start end start end start end 
matchlar: ^^^^^ ^^^  
( Misol ) Agar satringizda qator uzilishlari mavjud bo'lsa, u ^starthar qanday satr boshida "start" ketma-ketligiga mos keladi va end$istalgan qator oxiridagi "tugashi" ketma-ketligiga mos keladi (garchi buni bu erda ko'rsatish qiyin bo'lsa ham). Ushbu belgilar, ayniqsa, chegaralovchilarni o'z ichiga olgan ma'lumotlar bilan ishlashda foydalidir. ^Keling, 9-bosqichdan boshlab "fayl o'lchami" masalasiga "satrning boshlanishi" dan foydalanib qaytaylik . Ushbu misolda bizning fayl o'lchamlari bo'shliqlar bilan ajratilgan " ". Shunday qilib, biz har bir fayl o'lchami bo'sh joy belgisi yoki satr boshlanishidan oldin raqam bilan boshlanishini xohlaymiz:
naqsh: (^| )(\d+|\d+\.\d+)[KMGT]B 
qator:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
o'yinlar: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
guruh:    222 122 1222 12    
( Misol ) Biz allaqachon maqsadga juda yaqinmiz! Ammo bizda hali ham bitta kichik muammo borligini sezishingiz mumkin: biz fayl hajmidan oldingi bo'sh joy belgisini moslashtirmoqdamiz. Endi biz oddiy iboralar mexanizmi topsa, biz ushbu qo'lga olish guruhini (1) e'tiborsiz qoldiramiz yoki biz keyingi bosqichda ko'rib chiqiladigan tutib bo'lmaydigan guruhdan foydalanishimiz mumkin.

Shu bilan birga, ohang uchun yana ikkita muammoni hal qilaylik:

Oxirgi bosqichdagi sintaksisni ajratib ko'rsatish misolida davom etsak, ba'zi sintaksisni ajratib ko'rsatish orqadagi bo'shliqlarni, ya'ni bo'sh joy bo'lmagan belgi va qator oxiri o'rtasidagi bo'shliqlarni belgilaydi. Faqat keyingi bo'shliqlarni ta'kidlash uchun regexni yoza olasizmi?
naqsh:
string: myvec <- c(1, 2, 3, 4, 5)  
mos keladi:                          ^^^^^^^  
( Yechim ) Oddiy vergul bilan ajratilgan qiymat (CSV) tahlilchisi vergul bilan ajratilgan "tokenlar" ni qidiradi. Odatda, bo'sh joy qo'shtirnoq ichida bo'lmasa, hech qanday ma'noga ega emas "". Vergullar orasidagi belgilarga mos keladigan, lekin tirnoq orasidagi bo'sh bo'shliqni e'tiborsiz qoldiradigan ( tutmaydi ) oddiy CSV tahliliy muntazam ifodasini yozing .
naqsh:
string:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
mos keladi: ^^ ^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
guruh:    21 2221 2222212121 222221 222211 21 221 2    
( Yechim ) RegEx: oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 4-qism.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION