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.
Oldindan belgilangan belgilar sinflari
API sinfiPattern
oldindan belgilangan belgilar sinflarini o'z ichiga oladi, ular tez-tez ishlatiladigan oddiy iboralar uchun qulay yorliqlarni taklif qiladi. Ushbu jadvalda chap ustundagi konstruktsiyalar o'ng ustundagi iboralarning qisqacha ko'rinishidir. Masalan, \d
raqam (0-9) degan ma'noni anglatadi, \w
har 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 \Q
va \E
ularni 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 \d
muntazam 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: Birinchi 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
Kvantorlar 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: Yuqoridagi 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: uchta 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: Oddiy 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": "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: a{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: Minimal 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: Ushbu 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.
GO TO FULL VERSION