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. 1-qism

Guruhda nashr etilgan
Ushbu maqolaning asl nusxasi bu erda . Ehtimol, juda ko'p nazariya yo'q va men maqolaning oxirida regex bo'yicha batafsilroq materiallarga bir nechta havolalar beraman. Ammo menga oddiy iboralar kabi mavzuni o'rganishni boshlash, agar yo'lda kichik vazifalarni bajarib, nafaqat siqilish, balki bilimlarni darhol mustahkamlash imkoniyati mavjud bo'lsa, ancha qiziqarli bo'lib tuyuldi. RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-1-qismQani boshladik. Odatda dasturlashda muntazam iboralardan ("RegEx" yoki oddiygina "regex") foydalanishga qarshi bo'lganlar Jeymi Zavinskiga tegishli quyidagi iqtibosni keltiradilar: "Ba'zi odamlar muammoga duch kelganlarida, "Bilaman, men oddiy iboralarni ishlataman deb o'ylashadi. .'" Endi ularning ikkita muammosi bor". Aslida, muntazam iboralardan foydalanish hali yaxshi yoki yomon fikr emas. Va bu o'z-o'zidan muammolarni qo'shmaydi va ularning hech birini hal qilmaydi. Bu shunchaki vosita. Va uni qanday ishlatishingiz (to'g'ri yoki noto'g'ri) qanday natijalarni ko'rishingizni belgilaydi. Agar siz, masalan, HTML tahlilchisini yaratish uchun regexdan foydalanishga harakat qilsangiz, ehtimol siz og'riqni boshdan kechirasiz . Ammo, masalan, ba'zi qatorlardan vaqt belgilarini ajratib olishni istasangiz, ehtimol siz yaxshi bo'lasiz. Muntazam iboralarni oʻzlashtirishingizni osonlashtirish uchun men oddiy iboralarni yigirma qisqa qadamda noldan oʻzlashtirishingizga yordam beradigan ushbu darsni jamladim. Ushbu qo'llanma asosan muntazam iboralarning asosiy tushunchalariga qaratilgan va faqat kerak bo'lganda yanada ilg'or mavzularni o'rganadi.

1-qadam: Nima uchun oddiy iboralardan foydalanish kerak

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-2 qismMuntazam iboralar belgilangan naqshlar (naqshlar) yordamida matndagi mosliklarni qidirish uchun ishlatiladi. Regexdan foydalanib, biz matndan so'zlarni , shuningdek, ma'lum mezonlarga javob beradigan individual literal va meta belgilar va ularning ketma-ketligini osongina va sodda tarzda ajratib olishimiz mumkin . Vikipediya bizga ular haqida nima deydi : Muntazam iboralar metabelgilardan (joker belgilar) foydalanishga asoslangan matndagi pastki qatorlarni qidirish va boshqarish uchun rasmiy tildir. Qidiruv uchun belgilar va metaramzlardan tashkil topgan va qidirish qoidasini belgilaydigan namunali satr (inglizcha naqsh, rus tilida ko'pincha "shablon", "niqob" deb ataladi) ishlatiladi. Matnni o'zgartirish uchun qo'shimcha ravishda o'zgartirish qatori belgilanadi, unda maxsus belgilar ham bo'lishi mumkin. dogNaqsh ushbu jumladagi so'z kabi oddiy bo'lishi mumkin :
Tez jigarrang tulki dangasa itning ustiga sakraydi.
Ushbu muntazam ifoda quyidagicha ko'rinadi:
it
...Etarlicha oson, shunday emasmi? Naqsh, shuningdek, harfni o'z ichiga olgan har qanday so'z bo'lishi mumkin o. Bunday naqshni topish uchun muntazam ifoda quyidagicha ko'rinishi mumkin:
\Voy - buy *
( Ushbu muntazam iborani shu yerda sinab koʻrishingiz mumkin .) Siz “mos” talablar murakkablashgani sari muntazam ifoda ham murakkablashib borayotganini sezasiz. Belgilar guruhlarini belgilash va takrorlanuvchi naqshlarni moslashtirish uchun qo'shimcha belgilar shakllari mavjud, men ularni quyida tushuntiraman. Biroq, biz biron bir matndagi naqshga mos keladigan narsani topsak, u bilan nima qilishimiz mumkin? Zamonaviy muntazam ifoda mexanizmlari mavjud matndan belgilar yoki belgilar ketma-ketligini (pastki qatorlarni) ajratib olish yoki ularni olib tashlash yoki boshqa matn bilan almashtirish imkonini beradi. Umuman olganda, oddiy iboralar matnni tahlil qilish va boshqarish uchun ishlatiladi. Biz, masalan, IP manzillariga o'xshash pastki qatorlarni ajratib olishimiz va keyin ularni tekshirishga harakat qilishimiz mumkin. Yoki biz ismlar va elektron pochta manzillarini ajratib olishimiz va ularni ma'lumotlar bazasida saqlashimiz mumkin. Yoki elektron pochta xabarlarida maxfiy ma'lumotlarni (masalan, pasport raqamlari yoki telefon raqamlari) topish va foydalanuvchini o'zlarini xavf ostiga qo'yishi mumkinligi haqida ogohlantirish uchun oddiy iboralardan foydalaning. Regex haqiqatan ham oʻrganish oson, lekin oʻzlashtirish qiyin boʻlgan koʻp qirrali vositadir: “Musiqa asarini yaxshi ijro etish va musiqa yaratish oʻrtasida qanday farq bor boʻlsa, oddiy iboralarni bilish va ularni tushunish oʻrtasida ham farq bor”. - Jeffri E. F. Fridl, muntazam ifodalarni o'zlashtirish

2-qadam: kvadrat qavslar[]

Tushunish oson bo'lgan eng oddiy oddiy iboralar oddiy ifoda namunasi va maqsad qatori o'rtasida har bir belgi mosligini qidiradiganlardir. Keling, masalan, mushukni topishga harakat qilaylik: RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-3 qism
naqsh: mushuk
ip: Mushuk mashinaning tagiga yugurganida kesilgan.
mos keladi:      ^^^
( Bu amalda qanday ishlaydi - bu yerga qarang ) NB! Barcha echimlar bu erda faqat mumkin bo'lgan echimlar sifatida keltirilgan. Oddiy iboralarda, umuman dasturlashda bo'lgani kabi, siz bir xil muammolarni turli yo'llar bilan hal qilishingiz mumkin. Biroq, belgi-belgilarni qat'iy taqqoslashdan tashqari, kvadrat qavslar yordamida muqobil mosliklarni ham belgilashimiz mumkin:
naqsh: ca[rt]
ip: Mushuk mashinaning tagiga yugurganida kesilgan.
mos keladi:      ^^^ ^^^
( Bu qanday ishlaydi ) Kvadrat qavslarni ochish va yopish muntazam ifoda mexanizmiga u belgilangan belgilarning har qandayiga mos kelishini aytadi, lekin faqat bitta. Yuqoridagi muntazam ibora, masalan, cartbutun so'zni topa olmaydi, lekin uning faqat bir qismini topadi:
naqsh: ca[rt]
tor: aravaning tagiga yugurgan mushuk kesilgan.
mos keladi:      ^^^ ^^^
( Bu qanday ishlaydi ) Kvadrat qavslardan foydalanganda siz oddiy ifoda mexanizmiga qavs ichidagi belgilardan faqat bittasiga mos kelishini bildirasiz. Dvigatel belgini topadi c, keyin belgi a, lekin agar keyingi belgi ryoki bo'lmasa t, bu to'liq mos kelmaydi. Agar u ni topsa cava keyin yoki ryoki ni topsa t, u to'xtaydi. U ko'proq belgilarni moslashtirishga urinmaydi, chunki kvadrat qavslar mavjud belgilardan faqat bittasini moslashtirish kerakligini ko'rsatadi. Topgach , keyingi so'zda catopadi va to'xtaydi, chunki u allaqachon ketma-ketlik uchun moslikni topdi . rcartcar

Trening maqsadlari:

Mahalliy dialektdagi tarjima qilib bo‘lmaydigan so‘z birikmalaridan olingan ushbu parchadagi hadbarcha 10 ta naqshga mos keladigan muntazam iborani yozing :Had
naqsh:
string: Jim, qaerda Bill "had" , had had had "had" . "Had bor edi" to'g'ri edi.
mos keladi:                  ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^
( Mumkin yechimni bu yerda ko'ring ) Quyidagi gapdagi barcha hayvonlar nomlari haqida nima deyish mumkin?
naqsh:
tor: ko'rshapalaklar, mushuk va kalamush barga kirdi ...
mos keladi:    ^^^ ^^^ ^^^
( Mumkin yechim ) Yoki undan ham oddiyroq: so'zlarni toping baryoki bat:
naqsh:
tor: ko'rshapalaklar, mushuk va kalamush barga kirdi ...
mos keladi:    ^^^ ^^^
( Mumkin yechim ) Endi biz ko'p yoki kamroq murakkab muntazam iboralarni yozishni allaqachon o'rgandik va biz faqat 2-bosqichdamiz! Davom etaylik!

3-qadam: Qochish ketma-ketligi

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-4 qismOldingi bosqichda biz kvadrat qavslar []va ular regex mexanizmi yordamida muqobil mosliklarni topishga qanday yordam berishini bilib oldik. Ammo, agar biz ochiq va yopiq kvadrat qavslar ko'rinishidagi gugurtlarni topmoqchi bo'lsak-chi []? Biz so'zning har bir belgi mosligini topmoqchi bo'lganimizda cat, biz regex mexanizmini ushbu belgilar ketma-ketligi bilan ta'minladik ( cat). []Keling, xuddi shu tarzda kvadrat qavslarni topishga harakat qilaylik :
naqsh: [] 
string: Regex yordamida [] ga mos kela olmaysiz! Siz bundan afsuslanasiz!
mos keladi: 
( Keling, nima bo'lganini ko'rib chiqamiz ) Biroq, nimadir ishlamadi... Buning sababi, kvadrat qavs belgilari odatda boshqa biror narsani ko'rsatish uchun ishlatiladigan maxsus regex dvigatel belgilari sifatida ishlaydi va ularning o'zlari bilan mos keladigan so'zma-so'z naqsh emas. 2-bosqichdan eslayotganimizdek, ular regex mexanizmi ular orasidagi har qanday belgilarga mos kelishi uchun muqobil mosliklarni topish uchun ishlatiladi. Agar siz ularning orasiga biron bir belgi qo'ymasangiz, bu xatoga olib kelishi mumkin. Ushbu maxsus belgilarga mos kelish uchun biz ularning oldiga teskari chiziq belgisini qo'yish orqali ulardan qochishimiz kerak \. Teskari chiziq (yoki teskari chiziq) regex mexanizmiga keyingi belgini metabelgi sifatida ishlatishdan ko'ra, so'zma-so'z izlashni aytadigan yana bir maxsus belgidir. Regex mexanizmi faqat belgilarni qidiradi [va ]agar ularning ikkalasi oldida teskari chiziq bo'lsa:
naqsh: \[\]
string: Regex yordamida [] ga mos kela olmaysiz! Siz bundan afsuslanasiz!
mos keladi:                  ^^ 
( Keling, bu safar nima bo'lganini ko'rib chiqamiz ) OK, agar biz teskari chiziqning o'zini topmoqchi bo'lsak-chi? Javob oddiy. Teskari qiyshiq chiziq ham maxsus belgi bo'lgani uchun \, undan ham qochish kerak. Qanaqasiga? Teskari chiziq!
naqsh: \\
qator: C:\Users\Tanja\Pictures\Dogs
mos keladi:    ^ ^ ^ ^
( Amalda bir xil misol ) Faqat maxsus belgilar oldidan teskari chiziq qo'yilishi kerak. Boshqa barcha belgilar sukut bo'yicha tom ma'noda talqin qilinadi. Masalan, oddiy ibora faqat kichik harflarga tto'g'ri keladi :t
naqsh: t
qator: tttt
mos keladi: ^ ^ ^ ^
( Misol ) Biroq, bu ketma-ketlik \tboshqacha ishlaydi. Bu yorliq belgisini qidirish uchun shablon:
naqsh: \t
qator: tttt
mos keladi:   ^ ^ ^
( Misol\n ) Ba'zi bir umumiy qochish ketma-ketliklariga (UNIX uslubidagi qatorlar) va \r(Windows uslubidagi qator uzilishlarida qo'llaniladi ) kiradi \r\n. \r"karetaning qaytishi" belgisi bo'lib, \n"chiziq tasmasi" belgisi bo'lib, ikkalasi ham teletayp mashinalari hali keng qo'llanilganda ASCII standarti bilan birga belgilangan edi. Boshqa umumiy qochish ketma-ketliklari ushbu qo'llanmada keyinroq ko'rib chiqiladi.

Ayni paytda, keling, materialni bir nechta oddiy jumboqlar bilan mustahkamlaymiz:

Oddiy iborani topish uchun... muntazam ifoda yozishga harakat qiling;) Natija shunday bo'lishi kerak:
naqsh:
string: ...bu regex ` \[\] ` regex bilan mos kelsinmi?
mos keladi:                       ^^^^	
( Yechim ) Siz hal qildingizmi? Juda qoyil! Endi quyidagi kabi qochish ketma-ketliklarini qidirish uchun regex yaratishga harakat qiling:
naqsh:
string: ` \r `, ` \t ` va ` \n` hammasi regexdan qochish ketma-ketligidir.
mos keladi:   ^^ ^^ ^^
( Yechim )

4-qadam: nuqta yordamida "har qanday" belgini qidiring.

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-5 qismOldingi bosqichda ko'rgan qochib ketish ketma-ketligini mos keladigan echimlarni yozayotganda, siz "Teskari qiyshiq chiziq belgisini va undan keyin keladigan boshqa belgilarni moslashtira olamanmi?" deb hayron bo'lgandirsiz... Albatta mumkin! Har qanday belgiga (deyarli) mos keladigan yana bir maxsus belgi bor - nuqta (nuqta) belgisi. Bu nima qiladi:
naqsh: .
string: Kechirasiz, Deyv. Men buni qila olmayman deb qo'rqaman.
o'yinlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^	
( Misol ) Agar siz faqat qochish ketma-ketligiga o'xshash naqshlarni moslashni istasangiz, shunday qilishingiz mumkin:
naqsh: \\. 
string: Salom Walmart mening nabiram, uning ismi " \n \r \t ".
mos keladi:                                              ^^ ^^ ^^	
( Misol ) Va, barcha maxsus belgilarda bo'lgani kabi, agar siz harf .bilan mos kelmoqchi bo'lsangiz, uning oldiga belgi qo'yishingiz kerak \:
naqsh: \. 
string: Urush - tinchlik . Ozodlik bu qullik . Jaholat - bu kuch . 
mos keladi:             ^ ^ ^
( Misol )

5-qadam: Belgilar oralig'i

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-6 qismAgar sizga biron bir belgi kerak bo'lmasa, faqat matndan harflarni topmoqchi bo'lsangiz-chi? Yoki raqamlarmi? Yoki unlilarmi? Belgilar sinflari va ularning diapazonlari bo'yicha qidirish bizga bunga erishishga imkon beradi.
` \n `, ` \r ` va ` \t ` bo`shliq belgilar , ` \. `, ` \\ ` va ` \[ ` emas .	
Belgilar matnda ko'rinadigan belgi yaratmasa, "bo'sh joy" hisoblanadi . Bo'sh joy " " - bo'sh joy, qator uzilishi yoki yorliq. Aytaylik , biz faqat bo'sh joy belgilarini ifodalovchi qochish ketma-ketliklarini topmoqchimiz \nva yuqoridagi parchada boshqa qochish ketma-ketliklarini emas. Buni qanday qilishimiz mumkin edi? \r\t
naqsh: \\[nrt] 
string: ` \n `, ` \r ` va ` \t ` bo`shliq belgilar , ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:   ^^ ^^ ^^	
( Misol ) Bu ishlaydi, lekin bu juda oqlangan yechim emas. Keyinchalik "shakl tasmasi" belgisi uchun qochish ketma-ketligini moslashtirishimiz kerak bo'lsa-chi \f? (Ushbu belgi matndagi sahifa tanaffuslarini ko'rsatish uchun ishlatiladi.)
naqsh: \\[nrt] 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar , ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:   ^^ ^^ ^^	
( Yechim ishlamaydi ) Ushbu yondashuv bilan biz mos kelmoqchi bo'lgan har bir kichik harfni kvadrat qavs ichida alohida ro'yxatga olishimiz kerak. Buning eng oson yo'li har qanday kichik harfga mos keladigan belgilar oralig'idan foydalanishdir:
naqsh: \\[az] 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar, ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:   ^^ ^^ ^^ ^^	
( Va bu allaqachon ishlaydi ) Belgilar diapazonlari yuqoridagi misolni hisobga olgan holda siz kutganingizdek ishlaydi. Mos kelmoqchi bo'lgan birinchi va oxirgi harflar atrofiga kvadrat qavslar qo'ying, ularning orasiga defis qo'ying. \Misol uchun, agar siz faqat teskari chiziq "to'plamlari" va dan bir harfni atopmoqchi bo'lsangiz m, quyidagilarni qilishingiz mumkin:
naqsh: \\[am] 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar, ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:                         ^^	
( Misol ) Agar siz bir nechta diapazonlarni moslashtirmoqchi bo'lsangiz, ularni uchidan uchiga kvadrat qavslar orasiga qo'ying:
naqsh: \\[a-gq-z] 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar , ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:         ^^ ^^ ^^	
( Misol ) Boshqa umumiy belgilar diapazonlariga quyidagilar kiradi: A-Zva0-9

Keling, ularni amalda sinab ko'ramiz va bir nechta muammolarni hal qilamiz:

0-9O'n oltilik raqamlar raqamlar bilan bir qatorda harflarni ham o'z ichiga olishi mumkin A-F. Ranglarni belgilash uchun foydalanilganda, o'n oltilik kodlar ko'pi bilan uchta belgidan iborat bo'lishi mumkin. Quyidagi roʻyxatda yaroqli oʻn oltilik kodlarni topish uchun muntazam ifoda yarating:
naqsh:
qator: 1H8 4E2 8FF 0P1 T8B 776 42B G12
mos keladi:      ^^^ ^^^ ^^^ ^^^	
( Yechimy ) Belgilar diapazonidan foydalanib, quyidagi jumlada faqat kichik undoshlarni (unlilarni emas, shu jumladan) tanlaydigan muntazam ibora yarating :
naqsh:
tor : T h e w a lls i m a ll a r e t o t a lly , t o t a lly t a ll . 
mos keladi:   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^	
( Yechim )

6-qadam: "emas", karet, sirkumfleks, karet ... belgisi^

RegEx: Oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam.  1-7 qismHaqiqatan ham, bu belgi uchun 9000 dan ortiq nomlar mavjud :) Ammo, soddaligi uchun, ehtimol, biz "yo'q" ga e'tibor qaratamiz. Oxirgi muammoga yechimim biroz uzun. “Unlilardan tashqari butun alifboni oling” deyish uchun 17 ta belgi kerak boʻldi. Albatta, buni qilishning osonroq yo'li bor. "Yo'q" belgisi naqshda ko'rsatilganlarga mos kelmasligi kerak^ bo'lgan belgilar va belgilar oralig'ini belgilashga imkon beradi . Yuqoridagi so'nggi muammoning oddiyroq yechimi unlilarni ifodalamaydigan belgilarni topishdir:
naqsh: [^aeiou] tor 
:   The w a lls i m a ll a r e t o t a lly , t o t a lly t a ll . 
mosliklar: ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 	
( Misol^ ) Kvadrat qavs ichidagi eng chap belgi sifatidagi "emas" belgisi []oddiy ifoda mexanizmiga kvadrat qavs ichida bo'lmagan bitta (har qanday) belgiga mos kelishini bildiradi. Demak, yuqoridagi muntazam ibora gap boshidagi barcha boʻshliqlar, nuqtalar ., vergullar ,va bosh harflarga ham mos keladi. TUlarni istisno qilish uchun biz ularni kvadrat qavs ichiga ham qo'yishimiz mumkin:
naqsh: [^aeiou .,T] string  
: T h e w a lls i n th e m a ll a r e t o t o t li , t o t a lly t a ll . 
mos keladi:   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^	
( Misol ) EslatmaBu holda, biz oldin kvadrat qavslarsiz qidirganimizda bo'lgani kabi, teskari chiziq bilan nuqtadan qochishimiz shart emas. Kvadrat qavs ichidagi ko'plab maxsus belgilar tom ma'noda ishlanadi, shu jumladan ochiq [- lekin yopish emas - ]qavs belgisi (nega ekanligini taxmin qila olasizmi?). Teskari chiziq belgisi \ham tom ma'noda talqin etilmaydi. Agar kvadrat qavslar yordamida to'g'ridan-to'g'ri teskari chiziqqa mos kelmoqchi bo'lsangiz \, undan oldin quyidagi teskari qiyshiq chiziq qo'yish orqali qochishingiz kerak \\. Ushbu xatti-harakatlar bo'shliq belgilarini moslashtirish uchun kvadrat qavslarga ham joylashtirilishi uchun ishlab chiqilgan:
naqsh: [\t]
qator: tttt
mos keladi:   ^ ^ ^
( Misol ) “emas” belgisi ^diapazonlar bilan ham ishlatilishi mumkin. aAgar men faqat , b, c, va x, belgilarni suratga olishni istasam , men shunday qila olaman: yz
naqsh: [abcxyz] 
string:   abc defghijklmnopqrstuvw xyz 
mos keladi: ^^^ ^^^
( Misol ) ... yoki, va orasida bo'lmagan har qanday belgini topmoqchi ekanligimni belgilashim mumkin d:w
naqsh: [^dw] 
string:   abc defghijklmnopqrstuvw xyz 
mos keladi: ^^^ ^^^
( Misol ) Biroq,ehtiyot bo'ling"yo'q" bilan ^. "Yaxshi, men ko'rsatdim, shuning uchun dan keyin kichik harf yoki biror narsa [^ b-f]olishim kerak " deb o'ylash oson . Bu unday emas. Bu regex o'sha oraliqda bo'lmagan har qanday belgiga mos keladi, jumladan, harflar, raqamlar, tinish belgilari va bo'shliqlar. af
naqsh: [^dw] 
string:   abc defg h . i , j - klmnopqrstuvw xyz 
mos keladi: ^^^ ^ ^ ^ ^ ^^^
( Misol )

Darajani oshirish vazifalari:

^Quyidagi bilan tugamaydigan barcha so‘zlarga mos kelish uchun kvadrat qavs ichidagi “yo‘q” belgisidan foydalaning y:
naqsh:
string: day dog'hog hay bog bay ray rub 
matches:      ^^^ ^^^ ^^^ ^^^	
( Yechim^ ) 1977 va 1982 yillar (shu jumladan) oʻrtasidagi barcha yillarni topish uchun diapazon va “yoʻq” belgisidan foydalangan holda muntazam iborani yozing :
naqsh:
qator: 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
mos keladi:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
( Yechim ) "emas" belgisi bo'lmagan barcha belgilarni topish uchun muntazam iborani yozing ^:
naqsh:
string:   abc1 ^ 23*() 
mos keladi: ^^^^ ^^^^^	
( Yechim )

7-qadam: Belgilar sinflari

Belgilar sinflari belgilar diapazonidan ham oddiyroq. Turli xil muntazam ifoda dvigatellarida turli sinflar mavjud, shuning uchun men bu erda faqat asosiylarini ko'rib chiqaman. (Qaysi regex versiyasidan foydalanayotganingizni tekshiring, chunki ular koʻproq boʻlishi mumkin yoki ular bu yerda koʻrsatilganidan farq qilishi mumkin.) Belgilar sinflari deyarli diapazonlar kabi ishlaydi, lekin siz “start” va “tugash” qiymatlarini belgilay olmaysiz:
Sinf belgilar
\d "raqamlar"[0-9]
\w "so'z belgilari"[A-Za-z0-9_]
\s "bo'shliqlar"[ \t\r\n\f]
"So'z" belgilar sinfi \wayniqsa foydalidir, chunki bu belgilar to'plami ko'pincha turli dasturlash tillarida haqiqiy identifikatorlar (o'zgaruvchilar nomlari, funksiya nomlari va boshqalar) uchun talab qilinadi. \wBiz ilgari ko'rgan oddiy iborani soddalashtirish uchun foydalanishimiz mumkin :
naqsh: \\[az] 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar, ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:   ^^ ^^ ^^ ^^	
Foydalanish orqali \wbiz shunday yozishimiz mumkin:
naqsh: \\\w 
string: ` \n `, ` \r `, ` \t ` va ` \f ` bo`shliq belgilar , ` \. `, ` \\ ` va ` \[ ` emas .
mos keladi:   ^^ ^^ ^^ ^^	
( Misol )

Omad uchun 2 ta vazifa:

Siz va men bilganimizdek, Java'da identifikator (o'zgaruvchining nomi, sinf, funksiya va boshqalar) faqat a- zA- harfi Z, dollar belgisi $yoki pastki chiziq bilan boshlanishi mumkin _. ( Albatta, tagiga chizish yomon uslub, lekin kompilyator uni o'tkazib yuboradi, tarjimonning eslatmasi ). Qolgan belgilar "so'z" belgilar bo'lishi kerak \w. Bitta yoki bir nechta belgilar sinfidan foydalanib, quyidagi uchta belgi ketma-ketligi orasida haqiqiy Java identifikatorlarini qidirish uchun muntazam ifoda yarating:
naqsh:
string:   __e $12 .x2 foo Bar 3mm
mos keladi: ^^^ ^^^ ^^^ ^^^	
( Yechim ) AQSh ijtimoiy xavfsizlik raqamlari (SSN) XXX-XX-XXXX formatidagi 9 xonali raqamlar bo'lib, har bir X har qanday raqam bo'lishi mumkin [0-9]. Bir yoki bir nechta belgilar sinfidan foydalanib, quyidagi ro'yxatda to'g'ri formatlangan SSN-larni topish uchun muntazam ifoda yozing:
naqsh:
qator: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
mos keladi:              ^^^^^^^^^^^
( Yechim ) RegEx: oddiy iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 2-qism. Muntazam iboralarni o'zlashtirish uchun 20 ta qisqa qadam. 3-qism. 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