JavaRush /Java blogi /Random-UZ /Java tilidagi muntazam iboralar asoslari. 3-qism
articles
Daraja

Java tilidagi muntazam iboralar asoslari. 3-qism

Guruhda nashr etilgan
Keling, muntazam iboralarni o'rganishni davom ettiraylik. Ushbu maqolada biz oldindan belgilangan belgilar sinflari bilan bir qatorda miqdoriy aniqlashni (ketma-ketlikni qidirish) ko'rib chiqamiz. Java tilidagi muntazam iboralar asoslari.  3-1-qism

Oldindan belgilangan belgilar sinflari

API sinfi Patternoldindan belgilangan belgilar sinflarini o'z ichiga oladi, ular tez-tez ishlatiladigan oddiy iboralar uchun qulay yorliqlarni taklif qiladi. Java tilidagi muntazam iboralar asoslari.  3-2 qismUshbu jadvalda chap ustundagi konstruktsiyalar o'ng ustundagi iboralarning qisqacha ko'rinishidir. Masalan, \draqam (0-9) degan ma'noni anglatadi, \whar qanday katta yoki kichik harf, pastki chiziq yoki raqamni bildiradi. Iloji boricha oldindan belgilangan belgilar sinflaridan foydalaning. Bu sizning kodingizni o'qishni va xatolarni tuzatishni osonlashtiradi. Teskari chiziq bilan boshlangan konstruksiyalar escaped yoki protected deb ataladi. Oldingi maqolalarda biz teskari chiziq yoki belgilar bilan maxsus belgilardan qochish \Qva \Eularni oddiy belgilar sifatida ishlatish haqida allaqachon gapirgan edik. Agar siz oddiy belgilar (harf) bilan teskari chiziqdan foydalansangiz, ifoda kompilyatsiya qilish uchun teskari chiziqdan qochishingiz kerak.
private final String REGEX = "\\d"; // цифра
Bu misolda \dmuntazam ifoda; dastur kompilyatsiya qilish uchun qo'shimcha teskari chiziq kerak. Bizning sinov dasturimiz to'g'ridan-to'g'ri konsoldan oddiy iboralarni o'qiydi, shuning uchun qo'shimcha chiziq kerak emas. Quyidagi misol oldindan belgilangan belgilar sinflaridan foydalanishni ko'rsatadi: Java tilidagi muntazam iboralar asoslari.  3-3 qismJava tilidagi muntazam iboralar asoslari.  3-4 qismBirinchi uchta misolda muntazam ifoda oddiygina " ." (nuqta maxsus belgi), bu har qanday belgini bildiradi. Shuning uchun qidiruv barcha holatlarda muvaffaqiyatli bo'ldi. Boshqa misollar oldindan belgilangan belgilar sinflaridan foydalanadi, ularning ma'nolarini biz yuqoridagi jadvalda muhokama qildik.

Miqdor ko'rsatkichlari

Java tilidagi muntazam iboralar asoslari.  3-4 qismKvantorlar qatordagi belgilarning takrorlanish sonini belgilash imkonini beradi. Keling, ochko'z, dangasa va o'ta ochko'z miqdoriy belgilovchilarning qanday ishlashini batafsil ko'rib chiqaylik. Bir qarashda X?, X?? va X?+ xuddi shunday ishlaydi: “X bir marta mavjud yoki umuman yo‘q.” Ushbu miqdor ko'rsatkichlarini amalga oshirishda biroz farqlar mavjud, biz ularni quyida ko'rib chiqamiz.

Nol uzunligi mos keladi

Keling, ochko'zdan boshlaylik. Keling, uchta turli xil muntazam iboralarni yozaylik: maxsus belgilar bilan "a" harfi ?, * yoki +. Keling, ushbu muntazam iboralarni bo'sh satrda sinab ko'rsak nima bo'lishini ko'rib chiqamiz: Java tilidagi muntazam iboralar asoslari.  3-5 qismYuqoridagi misolda qidiruv dastlabki ikki holatda muvaffaqiyatli bo'ldi, chunki a? va a* satrda a belgisini yo'qotishga imkon beradi. Shuni ham yodda tutingki, boshlang'ich va oxirgi o'yin indekslari bir xil (0). Kirish satrining uzunligi bo'lmagani uchun dastur birinchi holatda hech narsa topmaydi :). Bu holat nol uzunlikdagi o'yin deb ataladi. Bunday o'yinlar bir nechta hollarda sodir bo'ladi: kiritish satri bo'sh bo'lganda, kiritish satrining boshida, satrning oxirgi belgisidan keyin yoki qatordagi belgilar orasida. Nol uzunlikdagi gugurtlarni aniqlash oson: ular bir xil holatda boshlanadi va tugaydi. Keling, nol uzunlikdagi mosliklarning yana bir nechta misollarini ko'rib chiqaylik. Keling, yana bir nechta misollar bilan nol uzunlikdagi o'yinlarni ko'rib chiqaylik. Keling, kirish satrini "a" belgisiga o'zgartiramiz va qiziqarli effektni kuzatamiz: Java tilidagi muntazam iboralar asoslari.  3-6 qismuchta kvant ko'rsatkichning barchasi "a" belgisini topdi, ammo belgining yo'qligini ta'minlaydigan birinchi ikkitasi 1-pozitsiyada nol uzunlikdagi moslikni topdi. - satrning oxirgi belgisidan keyin. Buning sababi, dastur "a" belgisini satr sifatida ko'rib chiqadi va boshqa mos kelmaguncha u orqali "ishlaydi". Amaldagi kvantga qarab, dastur satr oxirida "hech narsa" topadi yoki topmaydi. Endi kirish qatorini beshta “a” harfdan iborat ketma-ketlikka almashtiramiz: Java tilidagi muntazam iboralar asoslari.  3-7 qismOddiy ifoda a? satrdagi har bir harfga alohida moslikni topadi. a* ifodasi ikkita moslikni topadi: "a"' belgilar ketma-ketligi va 5-pozitsiyadagi nol uzunlikdagi moslik. Va nihoyat, a+ muntazam ifodasi “hech narsa”ni topmasdan, faqat “a” belgilar ketma-ketligini topadi :) Turli belgilarni o'z ichiga olgan qator kirish sifatida berilsa nima bo'ladi? Masalan, "ababaaaab": Java tilidagi muntazam iboralar asoslari.  3-8 qism"b" belgisi 1, 3 va 8 pozitsiyalarida va dastur bu pozitsiyalarda nol uzunlikdagi mosliklarni topadi. Oddiy ifoda a? "b" ga e'tibor bermaydi, balki "a" belgisining mavjudligini (yoki yo'qligini) qidiradi. Agar kvant "a" ning yo'qligiga imkon bersa, "a" dan boshqa barcha belgilar nol uzunlikdagi moslik sifatida ko'rsatiladi. Berilgan uzunlikdagi ketma-ketlikni topish uchun jingalak qavslar ichida uzunlikni belgilang: Java tilidagi muntazam iboralar asoslari.  3-9-qisma{3} muntazam ifodasi uchta "a" belgilar ketma-ketligini qidiradi. Birinchi qatorda hech narsa topilmadi, chunki qatorda a soni yetarli emas edi. Ikkinchisida dastur topadigan 3 ta belgi mavjud. Uchinchi test ham satr boshida moslikni topadi. 3-belgidan keyingi hamma narsa oddiy iborani qoniqtirmaydi, quyidagi kodda u mos keladi va bir nechta moslik bo'ladi: Java tilidagi muntazam iboralar asoslari.  3-10-qismMinimal ketma-ketlik uzunligini belgilash uchun foydalaning:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Ushbu misolda dastur faqat bitta moslikni topadi, chunki satr (3) "a" belgilarning ketma-ketlik uzunligi minimal talabiga javob beradi. Nihoyat, maksimal ketma-ketlik uzunligini o'rnatish: Java tilidagi muntazam iboralar asoslari.  3-11-qismUshbu misolda birinchi o'yin oltinchi belgi bilan yakunlandi. Ikkinchi o'yinda oltinchidan keyingi belgilar mavjud, chunki ular minimal uzunlik talabini qondiradi. Agar satr bir belgi qisqaroq bo'lsa, ikkinchi o'yin bo'lmaydi.

Belgilar guruhlari va sinflarni kvantlar bilan ishlatish

Shu nuqtaga qadar biz bir xil belgilarni o'z ichiga olgan satrlarda kvantlarni sinab ko'rdik. Miqdorlar faqat bitta belgi uchun qo'llaniladi, shuning uchun "abc+" oddiy iborasi "ab" va "c" ni o'z ichiga olgan qatorlarga bir yoki bir necha marta mos keladi. Bu bir yoki bir necha marta "abc" degan ma'noni anglatmaydi. Ammo kvantlar guruhlar va belgilar sinflari bilan birgalikda ishlatilishi mumkin, masalan, [abc]+ (a yoki b yoki c, bir yoki bir necha marta) yoki (abc)+ (“abc” bir yoki bir necha marta). Bir qatorda uch marta belgilar guruhini (it) topamiz: Java tilidagi muntazam iboralar asoslari.  3-12-qismBirinchi misolda dastur moslikni topadi, chunki kvantifikator belgilar guruhiga tarqaladi. Qavslarni olib tashlasangiz, miqdor belgilovchisi {3} faqat “g” harfi uchun amal qiladi. Belgilar sinflari bilan kvantatorlardan ham foydalanishingiz mumkin: Основы регулярных выражений в Java. Часть 3 - 13{3} kvantifikatori birinchi misoldagi qavs ichidagi belgilar sinfiga, ikkinchisida esa faqat “c” belgisiga tegishli.

Ochko'z, dangasa va haddan tashqari ochko'z miqdor ko'rsatkichlari o'rtasidagi farqlar

Ochko'z, istaksiz va egalik sonlovchilari o'rtasida ozgina farqlar mavjud. Ochko'z kvantlar shunday nomlanadi, chunki ular iloji boricha uzunroq moslikni topishga harakat qiladilar: dastur birinchi navbatda butun qatorni "yeyishga" harakat qiladi, agar moslik topilmasa, u holda bitta belgi o'chiriladi va moslik topilgunga qadar qidiruv takrorlanadi yoki boshqa belgilar qolmadi. Dangasalar esa chiziqning boshidan boshlab, o'ziga mos keladiganini topmaguncha, xarakterdan keyin xarakter qo'shadi. Nihoyat, rashk miqdorini aniqlash ochko'zlikdagi kabi belgilarni olib tashlamasdan butun qatorni bir marta skanerlaydi. Namoyish uchun biz xfooxxxxxxfoo qatoridan foydalanamiz. Основы регулярных выражений в Java. Часть 3 - 14Birinchi misolda har qanday belgini topish uchun ochko'z .* kvantifikatoridan foydalaniladi, 0 yoki undan ko'p marta, keyin esa "f" "o" "o" belgilari. Cantifier ochko'z bo'lgani uchun, topilgan o'yin butun qatorni o'z ichiga oladi. Ochko'z miqdoriy belgi qatordagi barcha mosliklarni topa olmaydi, chunki birinchi bosqichda, butun satrni skanerdan o'tkazgandan so'ng, u moslikni topadi va ishni tugatadi. Ikkinchi misol dangasa va satr boshidan boshlanadi, belgilar bilan belgilar qo'shadi. Dastur "bo'shliq" ni tekshirish bilan boshlanadi, ammo shundan beri "foo" ketma-ketligi satr boshida emas, qidiruv "x" belgisini qo'shish bilan davom etadi, shundan so'ng 0 va 4 indekslari orasida birinchi moslik topiladi. Qidiruv satr oxirigacha davom etadi. va ikkinchi moslik 4 va 13 indekslari orasida topiladi. Uchinchi misolda tasodiflar topilmaydi, chunki miqdor ko'rsatkichi hasad qiladi. Bunday holda, .*+ muntazam ifodasi butun qatorni "yeydi" va "foo" uchun hech narsa qoldirmaydi. Satrdagi keraksiz narsalarni tashlab qo'yish kerak bo'lganda, hasad qiluvchi miqdor ko'rsatkichidan foydalaning, u ekvivalent ochko'z miqdoriy belgidan ko'ra samaraliroq bo'ladi. Ana xolos! Manbaga havola: Java tilidagi muntazam iboralar asoslari. 3-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION