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

Java tilidagi oddiy iboralar, 1-qism

Guruhda nashr etilgan
Sizning e'tiboringizga JavaWorld veb-sayti uchun Jeff Friesen tomonidan yozilgan Java tilidagi muntazam iboralar bo'yicha qisqacha qo'llanmaning tarjimasini keltiramiz . O'qish qulayligi uchun biz maqolani bir necha qismga ajratdik. Java tilidagi oddiy ifodalar, 1-1-qism

Naqshlarni tanib olish va tavsiflash uchun Java dasturlarida Regular Expression API-dan foydalanish

Java-ning xarakteri va turli qatorli ma'lumotlar turlari naqshlarni moslashtirish uchun past darajadagi yordamni ta'minlaydi, ammo bu maqsadda ulardan foydalanish odatda sezilarli kod murakkabligini oshiradi. Oddiyroq va samaraliroq kod Regex API ("Regular Expression API") yordamida olinadi. Ushbu o'quv qo'llanma muntazam ifodalar va Regex API bilan ishlashni boshlashga yordam beradi. Biz birinchi navbatda paketdagi eng qiziqarli uchta sinfni muhokama qilamiz java.util.regex, so'ngra sinfning ichki qismini ko'rib chiqamiz Patternva uning naqshga mos keladigan murakkab tuzilmalarini o'rganamiz. Diqqat: Demo ilovaning manba kodini (JavaWorld sayti uchun Jeff Friesen tomonidan yaratilgan) ushbu maqoladan shu yerdan yuklab olishingiz mumkin .

Muntazam iboralar nima?

Muntazam ifoda (muntazam ifoda/regex/regexp) ma'lum qatorlar to'plamini tavsiflovchi naqsh bo'lgan qatordir. Naqsh qaysi qatorlar to'plamga tegishli ekanligini aniqlaydi. Naqsh to'g'ridan-to'g'ri va metabelgilardan iborat - to'g'ridan-to'g'ri emas, balki maxsus ma'noga ega bo'lgan belgilar. Pattern matching - bu mosliklarni, ya'ni oddiy ifoda naqshiga mos keladigan satrlarni topish uchun matnni qidirish. Java o'zining Regex API orqali naqsh mosligini qo'llab-quvvatlaydi. Ushbu API uchta sinfdan iborat: Pattern, Matcherva PatternSyntaxException, paketda joylashgan java.util.regex:
  • shablon deb ham ataladigan sinf ob'ektlari Patternmuntazam ifodalardir.
  • sinf ob'ektlari Matcheryoki mos keluvchilar - belgilar ketma-ketligidagi mosliklarni topish uchun naqshni talqin qilish mexanizmlari (sinflari interfeysni amalga oshiradigan java.lang.CharSequenceva matn manbalari sifatida xizmat qiladigan ob'ektlar).
  • Sinf ob'ektlari PatternSyntaxExceptionnoto'g'ri muntazam ifoda naqshlarini tasvirlash uchun ishlatiladi.
Java, shuningdek, turli xil usullar orqali naqshlarni moslashtirishni qo'llab-quvvatlaydi java.lang.String. Misol uchun, funktsiya faqat chaqiruvchi satr muntazam ifodaga to'liq mos keladigan bo'lsa, boolean matches (String regex)qaytadi . trueregex
Qulay usullar
matches()va sinfning boshqa muntazam ifodaga yo'naltirilgan qulaylik usullari Stringkaput ostida Regex API-ga o'xshash tarzda amalga oshiriladi.

RegexDemo

Men Java muntazam ifodalarini va , va RegexDemoning turli usullarini namoyish qilish uchun dastur yaratdim . Quyida ushbu demo ilovaning manba kodi keltirilgan. Listing 1. Muntazam ifoda namoyishi PatternMatcherPatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
mainSinf usuli qiladigan birinchi narsa RegexDemouning buyruq satrini tekshirishdir. Bu ikkita argumentni talab qiladi: birinchisi muntazam ifoda, ikkinchisi esa muntazam ifoda qidiriladigan kirish matni. Kiritilgan matn ichida yangi qator belgisidan foydalanish kerak bo'lishi mumkin (\n). \Buni faqat belgidan keyin belgini belgilash orqali amalga oshirish mumkin n. Funktsiya main()ushbu belgilar ketma-ketligini Unicode qiymatiga o'zgartiradi 10. Java tilidagi oddiy ifodalar, 1-2-qismKodning asosiy RegexDemoqismi try-catch. Blok tryavval berilgan muntazam ifodani va kiritilgan matnni chiqaradi, so'ngra Patternkompilyatsiya qilingan muntazam ifodani saqlaydigan ob'ektni yaratadi (odatiy iboralar naqsh mosligini yaxshilash uchun kompilyatsiya qilinadi). Ob'ektdan mos keluvchi chiqariladi Patternva barchasi topilmaguncha iterativ ravishda mosliklarni qidirish uchun ishlatiladi. Blok istisno haqida foydali ma'lumotlarni olish uchun catchbir nechta sinf usullarini chaqiradi . PatternSyntaxExceptionUshbu ma'lumot ketma-ket chiqish oqimiga chiqariladi. Kod qanday ishlashi haqida tafsilotlarni bilishning hojati yo'q: ular maqolaning ikkinchi qismida APIni o'rganganimizda aniq bo'ladi. Biroq, siz Listing 1ni kompilyatsiya qilishingiz kerak. 1-listdan kodni oling va kompilyatsiya qilish uchun buyruq satriga quyidagi buyruqni kiriting RegexDemo: javac RegexDemo.java

Pattern sinfi va uning konstruksiyalari

Regex API-ni tashkil etuvchi uchta sinfdan birinchisi bo'lgan sinf Patternmuntazam ifodaning kompilyatsiya qilingan ko'rinishidir. Sinf SDK hujjatlari Patternturli xil muntazam ifoda konstruksiyalarini tavsiflaydi, lekin agar siz muntazam ifodalardan faol foydalanmasangiz, ushbu hujjatning qismlari chalkash boʻlishi mumkin. Miqdor ko'rsatkichlari nima va ochko'z, istaksiz va egalik kvantlari o'rtasidagi farq nima? Belgilar sinflari, chegara moslamalari, orqaga havolalar va o'rnatilgan bayroq ifodalari nima? Men ushbu va boshqa savollarga keyingi bo'limlarda javob beraman.

Literal satrlar

Eng oddiy oddiy ifoda konstruksiyasi bu literal satrdir. Shaklni moslashtirish muvaffaqiyatli bo'lishi uchun kiritilgan matnning bir qismi ushbu konstruksiya naqshiga mos kelishi kerak. Quyidagi misolni ko'rib chiqing: Ushbu misolda biz kiritilgan matndagi java RegexDemo apple applet naqsh uchun moslikni topishga harakat qilmoqdamiz . Quyidagi natija topilgan o'yinni ko'rsatadi: appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Biz chiqishda muntazam ifodani va kiritilgan matnni, so'ngra appleappletda muvaffaqiyatli aniqlash belgisini ko'ramiz. Bundan tashqari, ushbu o'yinning boshlang'ich va yakuniy pozitsiyalari berilgan: 0va 4, mos ravishda. Boshlang'ich pozitsiyasi matndagi o'yin topilgan birinchi o'rinni, yakuniy pozitsiya esa o'yinning oxirgi nuqtasini ko'rsatadi. Keling, biz quyidagi buyruq qatorini berdik, deylik: java RegexDemo apple crabapple Bu safar biz turli xil boshlang'ich va tugatish pozitsiyalari bilan quyidagi natijani olamiz:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Aks holda, va appletmuntazam ifoda sifatida apple- kiritilgan matn bilan hech qanday moslik topilmaydi. Butun muntazam ifoda mos kelishi kerak, lekin bu holda, kiritilgan matnda tdan keyin mavjud emas apple. Java tilidagi oddiy ifodalar, 1-3-qism

Meta belgilar

Yana qiziqarli muntazam ifoda konstruksiyalari tom ma'nodagi belgilarni metabelgilar bilan birlashtiradi. Misol uchun, muntazam ifodada a.bnuqta metabelgisi va b (.)orasidagi har qanday belgini bildiradi . aQuyidagi misolni ko'rib chiqing: Bu misol oddiy ifoda sifatida ham, kiritish matni sifatida ham java RegexDemo .ox "The quick brown fox jumps over the lazy ox." foydalanadi . matndan istalgan belgidan boshlanib, bilan tugaydigan mosliklarni qidiradi, uning bajarilishi natijalari quyidagicha: .oxThe quick brown fox jumps over the lazy ox.RegexDemoox.
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Chiqishda biz ikkita moslikni ko'ramiz: foxva ox(oldida bo'sh joy belgisi bilan). Metabelgi birinchi holatda . belgiga, ikkinchi holatda bo'sh joyga mos keladi . Agar uni metabelgi bilan falmashtirsangiz nima bo'ladi ? Ya'ni, biz quyidagi buyruq qatori natijasida nima olamiz: Nuqta meta-belgi har qanday belgiga mos kelganligi sababli, kiritilgan matnning barcha belgilari (shu jumladan, orqadagi nuqta belgisi) uchun topilgan mosliklarni chiqaradi: .ox.java RegexDemo . "The quick brown fox jumps over the lazy ox."RegexDemo
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Iqtibos meta-belgilar
.Muntazam ifoda konstruksiyasida tom maʼnodagi belgi sifatida yoki boshqa metabelgilarni belgilash uchun siz quyidagi usullardan biri bilan undan qochishingiz kerak:
  • uning oldiga teskari chiziq belgisini qo'ying;
  • Ushbu metabelgini \Qva orasiga qo'ying \E(masalan, \Q.\E).
Satr harfida paydo bo'ladigan har qanday belgilarni takrorlashni unutmang, masalan, String regex = "\\.";teskari chiziq (masalan, \\.yoki \\Q.\\E). Buyruqlar qatori argumentining bir qismi bo'lgan teskari chiziqlarni takrorlamang.

Qahramonlar sinflari

Ba'zan siz izlayotgan o'yinlarni ma'lum belgilar to'plami bilan cheklashingiz kerak. Masalan, matndan a, e, i, ova unlilarini qidiring u, unli harfning har bir kelishi mos keladi. Bunday muammolarni hal qilishda bizga kvadrat qavslar meta-belgilari orasidagi belgilar to'plamini belgilaydigan belgilar sinflari yordam beradi ( [ ]). Sinf Patternoddiy belgilar sinflarini, diapazon sinflarini, teskari, birlashma, kesishish va ayirish sinflarini qo'llab-quvvatlaydi. Biz hozir ularning barchasini ko'rib chiqamiz.

Oddiy belgilar sinflari

Oddiy belgilar sinfi yonma-yon joylashtirilgan belgilardan iborat va faqat shu belgilarga mos keladi. Masalan, sinf , va belgilariga [abc]mos keladi . Quyidagi misolni ko'rib chiqing: Natijalardan ko'rinib turibdiki, bu misolda faqat mos keladigan belgi : abcjava RegexDemo [csw] caveccave
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

Inverted belgilar sinflari

Invertli belgilar sinfi metabelgidan boshlanadi ^va faqat unda mavjud bo'lmagan belgilarga mos keladi. Masalan, sinf , va dan [^abc]tashqari barcha belgilarga mos keladi . Quyidagi misolni ko'rib chiqing: E'tibor bering, mening operatsion tizimimda (Windows) ikkita tirnoq kerak, chunki qobiq ularni qochish belgisi sifatida ko'radi. Ko'rib turganingizdek, bu misolda faqat , va belgilari topildi , ular uchun mosliklar mavjud : abcjava RegexDemo "[^csw]" cave^avecave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

Rangli belgilar sinflari

Diapazon belgilari klassi defis ( -) bilan ajratilgan ikkita belgidan iborat. Defisning chap tomonidagi belgidan boshlab va o'ngdagi belgi bilan tugaydigan barcha belgilar diapazonning bir qismidir. Masalan, diapazon [a-z]barcha kichik lotin harflariga mos keladi. Bu oddiy sinfni belgilashga teng [abcdefghijklmnopqrstuvwxyz]. Quyidagi misolni ko'rib chiqing: Bu misol faqat mos keladigan java RegexDemo [a-c] clown belgiga mos keladi : cclown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java tilidagi oddiy iboralar, 2-qism Java tilidagi oddiy iboralar, 3-qism Java tilidagi oddiy iboralar, 4-qism Java tilidagi oddiy ifodalar, 5-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION