JavaRush /Java blogi /Random-UZ /Java tilidagi oddiy iboralar, 2-qism

Java tilidagi oddiy iboralar, 2-qism

Guruhda nashr etilgan
Sizning e'tiboringizga Jeff Friesen tomonidan javaworld veb-sayti uchun yozilgan Java tilidagi muntazam iboralar bo'yicha qisqacha qo'llanmaning tarjimasini taqdim etamiz . O'qish qulayligi uchun biz maqolani bir necha qismga ajratdik. Java tilidagi oddiy iboralar, 2-1-qismJava tilidagi oddiy iboralar, 1-qism
Bir nechta diapazonlarni birlashtirish
Bir nechta diapazonlarni yonma-yon joylashtirish orqali bitta diapazon belgilari sinfiga birlashtirishingiz mumkin. Masalan, sinf [a-zA-Z]kichik yoki katta harflardagi barcha lotin alifbosi belgilariga mos keladi.

Bir nechta diapazonlarni birlashtirish

Bir nechta diapazonlarni yonma-yon joylashtirish orqali bitta diapazon belgilari sinfiga birlashtirishingiz mumkin. Masalan, sinf [a-zA-Z]kichik yoki katta harflardagi barcha lotin alifbosi belgilariga mos keladi.

Belgilar sinflarini birlashtirish

Belgilar sinfi birlashmasi bir nechta ichki o'rnatilgan belgilar sinflaridan iborat va natijada paydo bo'lgan birlashmadagi barcha belgilarga mos keladi. Misol uchun, sinf dan va dan gacha [a-d[m-p]]belgilarga mos keladi . Quyidagi misolni ko'rib chiqing: Bu misolda , , va , belgilari topiladi . admpjava RegexDemo [ab[c-e]] abcdefabcdeabcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4

Belgilar sinfi kesishmasi

Belgilar sinflarining kesishishi barcha ichki o'rnatilgan sinflar uchun umumiy belgilardan iborat va faqat umumiy belgilarga mos keladi. Masalan, sinf , va belgilariga [a-z&&[d-f]]mos keladi . Quyidagi misolni ko'rib chiqing: E'tibor bering, mening Windows operatsion tizimimda ikkita tirnoq kerak, chunki buyruq qobig'i ularni buyruq ajratuvchi sifatida ko'radi. Bu misol faqat quyidagiga mos keladigan belgini topadi : defjava RegexDemo "[aeiouy&&[y]]" party&yparty
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

Belgilar sinflarini ayirish

Belgilar sinflarini ayirish ichki belgilar sinflaridagilardan tashqari barcha belgilardan iborat va faqat qolgan belgilarga mos keladi. Misol uchun, sinf dan va dan gacha [a-z&&[^m-p]]belgilarga mos keladi : Bu misolda quyidagi belgilar topiladi va ular uchun mos keladi : alqzjava RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefgdfabcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5

Oldindan belgilangan belgilar sinflari

Ba'zi belgilar sinflari stenografiyadan foydalanishni oqlash uchun muntazam iboralarda tez-tez paydo bo'ladi . Sinf Patternbunday qisqartmalar sifatida oldindan belgilangan belgilar sinflarini taklif qiladi. Ulardan oddiy iboralarni soddalashtirish va sintaksis xatolarini kamaytirish uchun foydalanishingiz mumkin. Oldindan belgilangan belgilar sinflarining bir nechta toifalari mavjud: standart, POSIX java.lang.Characterva Unicode xususiyatlari, masalan, skript, blok, kategoriya va ikkilik. Quyidagi ro'yxat faqat standart sinflar toifasini ko'rsatadi:
  • \d: Raqam. Ekvivalent [0-9].
  • \D: Raqamli bo'lmagan belgi. Ekvivalent [^0-9].
  • \s: Bo'shliq belgisi. Ekvivalent [ \t\n\x0B\f\r].
  • \S: Bo'shliq belgisi emas. Ekvivalent [^\s].
  • \w: So‘z yasovchi belgi. Ekvivalent [a-zA-Z_0-9].
  • \W: So‘z yasovchi belgi emas. Ekvivalent [^\w].
Quyidagi misolda \wkiritilgan matndagi barcha so‘z belgilarini tavsiflash uchun oldindan belgilangan belgilar sinfidan foydalaniladi: java RegexDemo \w "aZ.8 _" Nuqta va bo‘sh joy belgilari so‘z belgilari hisoblanmasligini ko‘rsatadigan quyidagi bajarish natijalarini diqqat bilan ko‘rib chiqing:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Chiziq ajratgichlar
Sinf SDK hujjatlari Patternnuqta meta-belgini chiziq ajratgichlardan tashqari har qanday belgiga mos keladigan oldindan belgilangan belgilar sinfi sifatida tavsiflaydi (satr oxirini belgilaydigan bir yoki ikki belgi ketma-ketligi). Istisno nuqtali rejim (keyinchalik muhokama qilamiz), bunda nuqtalar chiziq ajratuvchilarga ham mos keladi. Sinf Patternquyidagi qator ajratgichlarni ajratib turadi:
  • karetaning qaytish belgisi ( \r);
  • yangi satr belgisi (qog'ozni bir qator oldinga siljitish belgisi) ( \n);
  • zudlik bilan yangi satr belgisi ( ) keladigan karetani qaytarish belgisi \r\n;
  • keyingi qator belgisi ( \u0085);
  • chiziq ajratuvchi belgi ( \u2028);
  • paragraf ajratuvchi belgisi ( \u2029)

Qo'lga olingan guruhlar

Qo'lga olish guruhi topilgan belgilar to'plamini naqsh bo'yicha qidirishda keyingi foydalanish uchun saqlash uchun ishlatiladi. Bu konstruksiya metabelgilar ichiga qavs ( ) orqali olingan belgilar ketma-ketligidir ( ). Qo'lga olingan guruhdagi barcha belgilar naqsh bo'yicha qidirishda bir butun sifatida ko'rib chiqiladi. Masalan, suratga olish guruhi ( ) , va harflarini bitta Javabirlikka birlashtiradi . Ushbu suratga olish guruhi kiritilgan matndagi naqshning barcha holatlarini topadi . Har bir o'yinda oldingi saqlangan belgilar keyingilari bilan almashtiriladi. Qo'lga olingan guruhlar boshqa qo'lga olingan guruhlarga joylashtirilishi mumkin. Masalan, muntazam ifodada bir guruh guruh ichida joylashgan . Har bir ichki yoki ichki bo'lmagan suratga olish guruhiga 1 dan boshlab raqam beriladi va raqamlash chapdan o'ngga o'tadi. Oldingi misolda 1-guruh raqami va 2-guruh raqamiga mos keladi . Muntazam ifodada 1-guruh raqami va 2-guruh raqamiga mos keladi . Qoʻlga olish guruhlari tomonidan saqlangan oʻyinlarga keyinchalik qayta havolalar yordamida kirish mumkin. Teskari chiziq belgisi sifatida ko'rsatilgan va undan keyin olingan guruh soniga mos keladigan raqamli belgi, orqaga havola sizga guruh tomonidan olingan matndagi belgilarga murojaat qilish imkonini beradi. Orqaga havolaga ega bo'lish moslashtiruvchini olingan raqam asosida olingan guruhning saqlangan qidiruv natijalariga murojaat qilishiga olib keladi va keyin keyingi qidiruvga urinish uchun ushbu natijadagi belgilardan foydalaning. Quyidagi misol matndagi grammatik xatolarni topish uchun orqaga havoladan foydalanishni ko'rsatadi: Bu misolda kiritilgan matnda darhol keyingi takroriy so'z bilan grammatik xatoni topish uchun muntazam ifoda ishlatiladi . Ushbu muntazam ifoda ikki guruhni qo'lga kiritishni belgilaydi: 1-raqam , mos keladigan va 2-raqam , keyin bo'sh joy belgisiga mos keladi . Qayta havola 2-guruhning saqlangan natijasini qayta koʻrib chiqish imkonini beradi, shunday qilib moslashtiruvchi boʻsh joyning ikkinchi takrorlanishini , keyin boʻsh joyning birinchi paydo boʻlishidan soʻng va darhol izlashi mumkin . Musobaqa natijalari quyidagicha: JavaJavaJava(Java( language))(language)(Java)(Java( language))(language)(a)(b)(a)(b)Java tilidagi oddiy iboralar, 2-2-qismjava RegexDemo "(Java( language)\2)" "The Java language language"(Java( language)\2)languageJava"The Java language language"(Java( language)\2)Java language language(language)language\2languagelanguageRegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

Chegara moslamalari

Ba'zan siz satr boshida, so'z chegaralarida, matn oxirida va hokazolarda naqsh mosligini bajarishingiz kerak. PatternBuni quyidagi joylarda mosliklarni qidiradigan oddiy ifoda konstruksiyalari boʻlgan sinf chekka moslashtiruvchilaridan biri yordamida amalga oshirishingiz mumkin :
  • ^: qatorning boshlanishi;
  • $: qator oxiri;
  • \b: So'z chegarasi;
  • \B: Pseudoword chegarasi;
  • \A: matnning boshlanishi;
  • \G: Oldingi o'yinning oxiri;
  • \Z: Matn oxiri, keyingi qator ajratgichdan tashqari (agar mavjud bo'lsa);
  • \z: Matn oxiri
Quyidagi misolda, keyin nol yoki undan ortiq soʻz belgilari ^boʻlgan satrlarni topish uchun chegara moslashtiruvchi metabelgidan foydalaniladi: Belgi kiritiladigan matnning dastlabki uchta belgisi ketma-ket naqsh belgilariga mos kelishi kerakligini bildiradi va har qanday raqamdan keyin kelishi mumkin. so‘z yasovchi belgilar. Mana bajarilish natijasi: Thejava RegexDemo "^The\w*" Therefore^The
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Agar buyruq qatorini ga o'zgartirsangiz nima bo'ladi java RegexDemo "^The\w*" " Therefore"? Hech qanday moslik topilmaydi, chunki Thereforekiritish matni oldidan boʻsh joy belgisi qoʻyilgan.

Nol uzunligi mos keladi

Ba'zan, chekka moslamalar bilan ishlaganda, siz nol uzunlikdagi gugurtlarga duch kelasiz. Совпадение нулевой длиныhech qanday belgilarni o'z ichiga olmaydi o'yin. Ular bo'sh kiritilgan matnda, kiritilgan matnning boshida, kiritilgan matnning oxirgi belgisidan keyin va kiritilgan matnning istalgan ikkita belgisi orasida paydo bo'lishi mumkin. Nol uzunlikdagi o'yinlarni tanib olish oson, chunki ular har doim bir xil holatda boshlanadi va tugaydi. Quyidagi misolni ko'rib chiqing: java RegExDemo \b\b "Java is" Bu misol ikkita ketma-ket so'z chegaralarini qidiradi va natijalar quyidagicha ko'rinadi:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Natijalarda biz bir nechta nol uzunlikdagi o'yinlarni ko'ramiz. Bu erda yakuniy pozitsiyalar boshlang'ich pozitsiyalardan bir kam, chunki RegexDemomen 1-listda manba kodida ko'rsatganman end() – 1. Java tilidagi oddiy ifodalar, 2-3-qism

Miqdor ko'rsatkichlari

Miqdor ko'rsatkichi aniq yoki bilvosita naqshni raqamli qiymat bilan bog'laydigan muntazam ifoda konstruktsiyasidir. Ushbu raqamli qiymat naqshni necha marta qidirish kerakligini aniqlaydi. Miqdor ko'rsatkichlari ochko'z, dangasa va o'ta ochko'zlarga bo'linadi:
  • Ochko'z miqdoriy ko'rsatkichi ( ?, *yoki +) eng uzun moslikni topish uchun mo'ljallangan. So'rasam maylimi X? bir yoki bir nechta hodisalarni topish X, X*nol yoki bir nechta hodisalarni topish X, X+bir yoki bir nechta hodisalarni topish X, hodisalarni X{n}topish , hech bo'lmaganda (va ehtimol ko'proq) hodisalarni topish va hech bo'lmaganda, lekin ko'proq bo'lmagan hodisalarni topish .nXX{n,}nXX{n,m}nmX
  • Lazy kvantifikator ( ??, *?yoki +?) eng qisqa moslikni topish uchun mo'ljallangan. , X??ning bir yoki bir nechta holatlarini qidirishni belgilashingiz mumkin ? nol yoki bir nechta hodisalarni topish , bir yoki bir nechta hodisalarni topish , hodisalarni topish , kamida (va ehtimol ko'proq) hodisalarni topish va kamida , lekin ko'p bo'lmagan hodisalarni topish .XX*XX+?XX{n}?nXX{n,}?nXX{n,m}?nmX
  • O'ta ochko'z miqdoriy ko'rsatkichi ( ?+, *+yoki ++) ochko'z miqdoriy ko'rsatkichiga o'xshaydi, bundan tashqari, o'ta ochko'z miqdor ko'rsatkichi eng uzun moslikni topish uchun faqat bir marta urinib ko'radi, ochko'z miqdoriy ko'rsatkich esa bir nechta urinishlar qilishi mumkin. X?+Bir yoki bir nechta hodisalarni topish X, X*+nol yoki bir nechta hodisalarni topish X, X++bir yoki bir nechta hodisalarni topish X, hodisalarni X{n}+topish , kamida (va ehtimol ko'proq) hodisalarni topish va kamida , lekin ko'p bo'lmagan hodisalarni topish uchun sozlanishi mumkin. .nXX{n,}+nXX{n,m}+ nmX
Quyidagi misol ochko'z miqdoriy ko'rsatkichining ishlatilishini ko'rsatadi: java RegexDemo .*ox "fox box pox" Mana natijalar:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Ochko'z miqdoriy ko'rsatkichi ( .*) bilan tugaydigan belgilarning eng uzun ketma-ketligini topadi ox. U butun kiritilgan matnni sarflaydi va keyin kiritilgan matn shu belgilar bilan tugashini aniqlamaguncha orqaga qaytariladi. Keling, dangasa kvantifikatorni ko'rib chiqaylik: java RegexDemo .*?ox "fox box pox" Uning natijalari:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Lazy kvantifikator ( .*?) bilan tugaydigan belgilarning eng qisqa ketma-ketligini topadi ox. U bo'sh satrdan boshlanadi va mos kelguncha belgilarni asta-sekin iste'mol qiladi. Va keyin kirish matni tugaguncha ishlashni davom ettiradi. Va nihoyat, keling, o'ta ochko'z miqdorni ko'rib chiqaylik: java RegexDemo .*+ox "fox box pox" Va uning natijalari:
regex = .*+ox
input = fox box pox
Qo'shimcha ochko'z miqdoriy ko'rsatkichi ( ) mos keladiganlarni topa olmaydi, chunki u barcha kiritilgan matnni sarflaydi va muntazam ifoda oxirida .*+mos keladigan hech narsa qolmaydi . oxOchko'z miqdoriy ko'rsatkichidan farqli o'laroq, o'ta ochko'z miqdoriy belgi orqaga qaytmaydi.

Nol uzunligi mos keladi

Ba'zan kvantlar bilan ishlashda siz nol uzunlikdagi mosliklarga duch kelasiz. Misol uchun, quyidagi ochko'z miqdoriy belgidan foydalanish bir nechta nol uzunlikdagi mosliklarni keltirib chiqaradi: java RegexDemo a? abaa Ushbu misolni bajarish natijalari:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Ijro natijalarida beshta o'yin mavjud. Birinchi, uchinchi va to'rtinchisi juda kutilgan bo'lsa-da (ular uchta harfning pozitsiyalariga mos keladi a) abaa, ikkinchi va beshinchi sizni hayratda qoldirishi mumkin. Go'yo ular matnning oxiriga amos keladigan narsani ko'rsatadiganga o'xshaydi , lekin aslida bunday emas. bMuntazam ibora matn oxirida a?qidirmaydi . bU borlik yoki yo'qlikni qidiradi a. ni a?topmasa a, uni nol uzunlikdagi moslik deb xabar qiladi.

Ichki bayroq ifodalari

Matchlar odatiy ifodani naqshga kompilyatsiya qilishda bekor qilinishi mumkin bo'lgan ba'zi bir sukut bo'yicha taxminlarni yaratadilar. Bu masalani keyinroq muhokama qilamiz. Muntazam ifoda ichki bayroq ifodasi yordamida har qanday standartni bekor qilishga imkon beradi. Ushbu muntazam ifoda konstruksiyasi savol belgisi metabelgisi ( ) atrofidagi qavslar metabelgisi sifatida ko'rsatilgan ?va undan keyin kichik lotin harfi keladi. Sinf Patternquyidagi ichki bayroq ifodalarini tushunadi:
  • (?i): katta-kichik harflarga sezgir bo'lmagan naqshni moslashtirishni yoqadi. Masalan, buyruqdan foydalanganda java RegexDemo (?i)tree Treehousebelgilar ketma-ketligi Treenaqshga mos keladi tree. Odatiy boʻlib katta-kichik harflarni hisobga olgan holda namuna qidirish hisoblanadi.
  • (?x): Naqsh ichidagi metabelgidan boshlanadigan bo'shliq belgilaridan va izohlardan foydalanishga ruxsat beradi #. Mos keluvchi ikkalasini ham e'tiborsiz qoldiradi. Misol uchun, java RegexDemo ".at(?x)#match hat, cat, and so on" matterbelgilar ketma-ketligi uchun matnaqsh mos keladi .at. Odatiy bo'lib, bo'sh joy belgilari va izohlarga ruxsat berilmaydi va moslashtiruvchi ularni qidirishda ishtirok etgan belgilar sifatida ko'radi.
  • (?s): Dotall rejimini yoqadi, bunda nuqta metabelgisi boshqa belgilarga qo'shimcha ravishda chiziq ajratgichlarga mos keladi. Masalan, buyruq java RegexDemo (?s). \nyangi qator belgisini topadi. Standart dotall ga qarama-qarshidir: hech qanday chiziq ajratuvchi topilmaydi. Masalan, buyruq Java RegexDemo . \nyangi qator belgisini topa olmaydi.
  • (?m)^: Har bir satrning boshi va $oxiriga mos keladigan ko'p qatorli rejimni yoqadi . Masalan, java RegexDemo "(?m)^abc$" abc\nabckirish matnidagi ikkala ketma-ketlikni topadi abc. Odatiy bo'lib, bitta qatorli rejim ishlatiladi: ^butun kiritilgan matnning boshiga mos keladi va $uning oxiriga mos keladi. Misol uchun, java RegexDemo "^abc$" abc\nabchech qanday mos kelmaydigan javobni qaytaradi.
  • (?u): Unicode-sezgir katta-kichik harflarni tekislashni yoqadi. Bu bayroq bilan birgalikda foydalanilganda (?i), Unicode standartiga muvofiq katta-kichik harflarga sezgir bo'lmagan naqshlarni moslashtirish imkonini beradi. Standart sozlama faqat katta-kichik va US-ASCII belgilarni qidirishdan iborat.
  • (?d): Unix uslubidagi satr rejimini yoqadi, bunda mos keluvchi kontekstdagi metabelgilarni .va ^faqat $chiziq ajratuvchini taniydi \n. Odatiy bo'lib, Unix uslubi bo'lmagan satr rejimi: mos keluvchi yuqoridagi metabelgilar kontekstida barcha chiziq chegaralovchilarini taniydi.
Ichki bayroq ifodalari qo'lga kiritilgan guruhlarga o'xshaydi, chunki ularning belgilari qavs meta-belgilari bilan o'ralgan. Qo'lga kiritilgan guruhlardan farqli o'laroq, ichki bayroq ifodalari qo'lga kiritilmagan guruhlarga misol bo'lib, ular matn belgilarini ushlamaydigan muntazam ifoda konstruktsiyasidir. Ular qavslar meta-belgilari bilan o'ralgan belgilar ketma-ketligi sifatida aniqlanadi.
Bir nechta ichki bayroq ifodalarini belgilash
(?m)(?i))Muntazam ifodada bir nechta ichki bayroq ifodalarini ularni yonma-yon joylashtirish ( ) yoki ularni belgilovchi harflarni ketma-ket joylashtirish ( ) orqali belgilash mumkin (?mi).

Xulosa

Siz allaqachon tushunganingizdek, muntazam iboralar juda foydali va ularning sintaksisining nuanslarini o'zlashtirganingiz uchun yanada foydali bo'ladi. Hozirgacha men sizni muntazam iboralar asoslari va Pattern. Pattern2-qismda biz Regex API-ni chuqurroq ko'rib chiqamiz va , Matcherva usullarini o'rganamiz PatternSyntaxException. Shuningdek, men sizga Regex API ning ikkita amaliy ilovasini ko'rsataman, ulardan siz darhol dasturlaringizda foydalanishingiz mumkin. Java tilidagi oddiy iboralar, 3-qism Java tilidagi oddiy iboralar, 4-qism Java tilidagi oddiy iboralar, 5-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION