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

Java tilidagi oddiy iboralar, 3-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 ifodalar, 3-qism - 1Java tilidagi oddiy iboralar, 1-qism Java tilidagi oddiy iboralar, 2-qism

Regex API bilan umumiy dasturlash vazifalarini soddalashtiring

Ushbu maqolaning 1 va 2-qismlarida siz oddiy iboralar va Regex API bilan tanishdingiz. Siz sinf haqida bilib oldingiz Patternva oddiy ibora konstruksiyalarini ko‘rsatadigan misollarni ko‘rib chiqdingiz, oddiy satrlar yordamida oddiy naqsh moslashuvidan tortib diapazonlar, chegara moslamalari va miqdoriy ko‘rsatkichlar yordamida murakkabroq moslashtirishgacha. Ushbu va keyingi qismlarda biz birinchi qismda ko'rib chiqilmagan masalalarni ko'rib chiqamiz, sinflarning tegishli usullarini o'rganamiz Pattern, Matcherva PatternSyntaxException. Shuningdek, siz oddiy dasturlash muammolarini osonlashtirish uchun oddiy iboralardan foydalanadigan ikkita yordamchi dasturni o'rganasiz . Birinchisi, hujjatlar uchun koddan sharhlarni chiqaradi. Ikkinchisi - leksik tahlilni amalga oshirish uchun mo'ljallangan qayta foydalanish mumkin bo'lgan kodlar kutubxonasi - assemblerlar, kompilyatorlar va shunga o'xshash dasturlarning muhim komponenti.

MANBA KODI YUKLAB OLISH

Ushbu maqoladagi demo ilovalar uchun barcha manba kodini (JavaWorld uchun Jeff Friesen tomonidan yaratilgan) shu yerdan olishingiz mumkin .

Regex API-ni o'rganish

Pattern, Matcherva PatternSyntaxExceptionRegex API ni tashkil etuvchi uchta sinf. Ularning har biri kodingizda muntazam ifodalardan foydalanish imkonini beruvchi usullarni taqdim etadi.

Pattern sinfining usullari

Sinf misoli Patternkompilyatsiya qilingan muntazam ifoda bo'lib, naqsh deb ham ataladi. Oddiy iboralar naqshlarni moslashtirish operatsiyalari samaradorligini oshirish uchun tuzilgan. Quyidagi statik usullar kompilyatsiyani qo'llab-quvvatlaydi.
  • Pattern compile(String regex)kontentni regexyangi saqlanadigan oraliq vakillikka kompilyatsiya qiladi Pattern. Bu usul muvaffaqiyatli bo'lsa, ob'ektga havolani qaytaradi yoki PatternSyntaxExceptionnoto'g'ri muntazam ifoda sintaksisi aniqlansa, istisno qiladi. MatcherUshbu ob'ekt tomonidan ishlatiladigan yoki undan qaytarilgan sinfning har qanday ob'ekti Patterno'zining standart sozlamalaridan foydalanadi, masalan, katta-kichik harflarni hisobga olgan holda qidirish. Misol tariqasida, kod parchasi nuqta belgisi bilan boshlanadigan satrlarga mos keladigan muntazam ifodaning kompilyatsiya qilingan tasvirini saqlaydigan Pattern p = Pattern.compile("(?m)^\\."); ob'ektni yaratadi .Pattern

  • Pattern compile(String regex, int flags)bilan bir xil muammoni hal qiladi Pattern compile(String regex), lekin hisobga olgan holda flags: OR tipidagi bit bayroqlari uchun bit konstantalari to'plami. Sinf bitli OR (masalan, ) yordamida birlashtirilishi va argument sifatida uzatilishi mumkin bo'lgan Patterndoimiylarni e'lon qiladi .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINESCASE_INSENSITIVE | DOTALLflags

  • dan tashqari CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS, bu konstantalar 1-qismda ko'rsatilgan ichki bayroq ifodalariga muqobildir. Agar sinfda belgilanganidan boshqa bayroq konstantasi uchrasa Pattern, usul Pattern compile(String regex, int flags) istisno qiladi java.lang.IllegalArgumentException. Masalan, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);oldingi misolga ekvivalent, doimiy Pattern.MULTILINEva ichki bayroq ifodasi (?m)bir xil ishni bajaradi.
Ba'zan ob'ektga kompilyatsiya qilingan muntazam ifodaning asl satrining nusxasini Patternu foydalanadigan bayroqlar bilan birga olish kerak bo'ladi. Buning uchun siz quyidagi usullarga qo'ng'iroq qilishingiz mumkin:
  • String pattern()a ga kompilyatsiya qilingan asl muntazam ifoda qatorini qaytaradi Pattern.

  • int flags()ob'ektning bayroqlarini qaytaradi Pattern.
Ob'ektni olgandan so'ng , u odatda naqsh moslashtirish operatsiyalarini bajarish uchun Patternob'ektni olish uchun ishlatiladi . MatcherUsul ob'ekt naqshiga mos keladigan matnni qidiradigan Matcher matcher(Charsequence input)ob'ektni yaratadi . Chaqirilsa, u ushbu ob'ektga havolani qaytaradi . Masalan, buyruq o'zgaruvchi tomonidan havola qilingan ob'ektni qaytaradi . MatcherinputPatternMatcherMatcher m = p.matcher(args[1]);MatcherPatternp
Bir martalik qidiruv
static boolean matches(String regex, CharSequence input)Sinf usuli shablon yordamida Patternob'ektlarni yaratish Patternva Matcherbir martalik qidirishni tejash imkonini beradi. inputAgar naqsh mos bo'lsa , bu usul "true" ni qaytaradi regex, aks holda "false" qiymatini qaytaradi. Agar muntazam ifoda sintaksis xatosi bo'lsa, usul istisno qiladi PatternSyntaxException. Masalan, iborada faqat bo'shliqlar va kichik harflar mavjudligini tasdiqlovchi System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));chop etadi . trueall lowercase letters and whitespace only
Java tilidagi oddiy iboralar, 3-2-qism

Matnni ajratish

Ko'pgina ishlab chiquvchilar matnga asoslangan ishchi hisobini maydonlar to'plamiga aylantirish kabi kiritilgan matnni tarkibiy qismlarga ajratish uchun kamida bir marta yozilgan kodga ega. Sinf Patternmatnni ajratishning ikkita usulidan foydalangan holda ushbu zerikarli vazifani yanada qulayroq hal qilish imkoniyatini beradi:
  • Usul ob'ekt naqshiga topilgan mosliklarga ko'ra String[] split(CharSequence text, int limit)bo'linadi va natijalarni massivda qaytaradi. Har bir massiv elementi keyingi ketma-ketlikdan naqshga mos keladigan matn fragmenti (yoki matn oxiri) bilan ajratilgan matn ketma-ketligini belgilaydi. Massivning elementlari qanday tartibda paydo bo'lsa, xuddi shunday tartibda bo'ladi .textPatterntext

    Ushbu usulda massiv elementlari soni parametrga bog'liq bo'lib limit, u topiladigan mosliklar sonini ham boshqaradi.

    • Ijobiy qiymat moslikdan ko'p bo'lmagan qiymatlarni qidiradi limit-1va massiv uzunligi elementlardan oshmaydi limit.
    • Agar qiymat manfiy bo'lsa, barcha mumkin bo'lgan mosliklar qidiriladi va massiv uzunligi ixtiyoriy bo'lishi mumkin.
    • Agar qiymat nolga teng bo'lsa, barcha mumkin bo'lgan mosliklar qidiriladi, massiv uzunligi ixtiyoriy bo'lishi mumkin va oxiridagi bo'sh satrlar o'chiriladi.

  • Usul String[] split(CharSequence text)chegara argumenti sifatida 0 bilan oldingi usulni chaqiradi va uning chaqiruvi natijasini qaytaradi.
split(CharSequence text)Xodimlar hisobini ism, yosh, pochta manzili va ish haqi bo'yicha alohida sohalarga bo'lish muammosini hal qilish usulining natijalari quyida keltirilgan :
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
   System.out.println(fields[i]);
Yuqoridagi kod vergul belgisidan so'ng darhol bitta bo'sh joy belgisini topish uchun muntazam ifodani tavsiflaydi. Mana uning ijrosi natijalari:
John Doe
47
Hillsboro Road
32000

Shablon predikatlar va Streams API

Java 8 da, sinfda Patternusul paydo bo'ldi . Bu usul naqshga mos keladigan predikat (mantiqiy qiymatga ega funktsiya) yaratadi. Ushbu usuldan foydalanish quyidagi kod parchasida ko'rsatilgan: Predicate asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Ushbu kod dasturlash tili nomlari ro'yxatini yaratadi, so'ngra harf bilan boshlanadigan barcha nomlarni topish uchun naqsh tuzadi c. Yuqoridagi kodning oxirgi qatori manba sifatida ushbu ro'yxat bilan ketma-ket ma'lumotlar oqimini qabul qilishni amalga oshiradi. U mantiqiy funktsiyadan foydalangan holda filtrni o'rnatadi asPredicate(), u nom harf bilan boshlanganda rostini qaytaradi cva oqim bo'ylab takrorlanadi va mos nomlarni standart chiqishga chop etadi. Ushbu oxirgi qator 1-qismdagi RegexDemo ilovasidan tanish bo'lgan quyidagi oddiy tsiklga teng:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

Matcher sinf usullari

Sinfning namunasi Matchersinfning tuzilgan muntazam ifodasini sharhlash orqali belgilar ketma-ketligida naqshlarni moslashtirish operatsiyalarini bajarish mexanizmini tavsiflaydi Pattern. Sinf ob'ektlari Matchernaqshlarni qidirishning har xil turlarini qo'llab-quvvatlaydi:
  • Usul boolean find()keyingi moslik uchun kiritilgan matnni qidiradi. Ushbu usul skanerlashni belgilangan matnning boshida yoki oldingi moslikdan keyingi birinchi belgidan boshlaydi. Ikkinchi variant, agar ushbu usulga oldingi qo'ng'iroq haqiqiy bo'lsa va hal qiluvchi qayta o'rnatilmagan bo'lsa, mumkin. Har qanday holatda, agar qidiruv muvaffaqiyatli bo'lsa, mantiqiy qiymat true qaytariladi. Ushbu usulning namunasini RegexDemo1-qismda topish mumkin.

  • Usul boolean find(int start)mos keluvchini qayta o'rnatadi va keyingi mos keladigan matnni qidiradi. Ko'rish parametr bilan belgilangan joydan boshlanadi start. Qidiruv muvaffaqiyatli bo'lsa, mantiqiy qiymat true qaytariladi. Masalan, m.find(1);matnni pozitsiyadan boshlab skanerlaydi 1(0 pozitsiyasi e'tiborga olinmaydi). Agar parametrda startmanfiy qiymat yoki mos keluvchi matn uzunligidan kattaroq qiymat bo'lsa, usul istisno qiladi java.lang.IndexOutOfBoundsException.

  • Usul boolean matches()barcha matnni naqshga moslashtirishga harakat qiladi. Agar barcha matn naqshga mos kelsa, u mantiqiy qiymatni qaytaradi. Misol uchun, kod so'z belgisi emasligi sababli Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());chiqadi .false!

  • Usul boolean lookingAt()belgilangan matnni naqsh bilan moslashtirishga harakat qiladi. Agar matnning biron bir qismi naqshga mos kelsa, bu usul true qiymatini qaytaradi. Usuldan farqli o'laroq matches();, barcha matnlar naqshga mos kelishi shart emas. Masalan, Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());u chiqadi true, chunki matn boshida abc!faqat so'z yasovchi belgilar mavjud.

Sinf ob'ektlaridan farqli o'laroq Pattern, sinf ob'ektlari Matcherholat ma'lumotlarini saqlaydi. Ba'zan naqsh qidirish tugagandan so'ng ushbu ma'lumotni o'chirish uchun moslashtiruvchini qayta o'rnatishingiz kerak bo'lishi mumkin. Resolverni qayta tiklash uchun quyidagi usullar mavjud:
  • Usul Matcher reset()mos keluvchining holatini, shu jumladan oxiriga qo'shilishi kerak bo'lgan pozitsiyani tiklaydi (0 ga qayta o'rnatiladi). Keyingi naqsh qidirish operatsiyasi mos keluvchi matnning boshidan boshlanadi. Joriy ob'ektga havolani qaytaradi Matcher. Masalan, m.reset();tomonidan havola qilingan rezolyutsiyani tiklaydi m.

  • Usul Matcher reset(CharSequence text)hal qiluvchi holatini tiklaydi va yangi yechim matnini ga o'rnatadi text. Keyingi naqsh qidirish operatsiyasi yangi mos keluvchi matn boshida boshlanadi. Joriy ob'ektga havolani qaytaradi Matcher. Misol uchun, m.reset("new text");havola qilingan hal qiluvchini qayta o'rnatadi mva yangi rezolyutsiya matnini ga o'rnatadi "new text".

Java tilidagi oddiy iboralar, 3-3-qism

Oxiriga matn qo'shish

Oxiriga qo'shiladigan moslashtiruvchining pozitsiyasi turdagi ob'ektning oxiriga qo'shiladigan moslashtiruvchi matnning boshlanishini bildiradi java.lang.StringBuffer. Quyidagi usullar ushbu pozitsiyadan foydalanadi:
  • Usul mos keluvchi matn belgilarini o'qiydi va ularni argument tomonidan havola qilingan Matcher appendReplacement(StringBuffer sb, String replacement)ob'ektning oxiriga qo'shadi . Ushbu usul oldingi naqsh mosligidan oldingi oxirgi belgida o'qishni to'xtatadi. Keyinchalik, usul argument tomonidan havola qilingan turdagi ob'ektdan belgilarni ob'ekt oxiriga qo'shadi (satr oldingi qidiruv paytida olingan matn ketma-ketligiga havolalarni o'z ichiga olishi mumkin; ular olingan belgilar va guruh raqamlari yordamida ko'rsatilgan ). Nihoyat, usul so'nggi mos keladigan belgining pozitsiyasiga qo'shiladigan mos keluvchi pozitsiyasining qiymatini o'rnatadi va keyin joriy moslashtiruvchiga havolani qaytaradi.StringBuffersbStringreplacementStringBufferreplacement($)

  • Agar mos keluvchi moslikni hali topmagan bo'lsa yoki oldingi qidiruv urinishi muvaffaqiyatsiz bo'lsa, usul Matcher appendReplacement(StringBuffer sb, String replacement)istisno qiladi . Agar chiziq naqshda bo'lmagan suratga olish guruhini ko'rsatsa, java.lang.IllegalStateExceptionu istisno qiladi ).IndexOutOfBoundsExceptionreplacement

  • Usul StringBuffer appendTail(StringBuffer sb)ob'ektga barcha matnni qo'shadi StringBufferva ushbu ob'ektga havolani qaytaradi. Oxirgi usul chaqiruvidan so'ng , qolgan matnni ob'ektga nusxalash uchun appendReplacement(StringBuffer sb, String replacement)usulni chaqiring .appendTail(StringBuffer sb)StringBuffer

Qo'lga olingan guruhlar
1-qismdan eslaganingizdek, suratga olish guruhi qavslar ( ()) meta-belgilari ichiga olingan belgilar ketma-ketligidir. Ushbu konstruksiyaning maqsadi topilgan belgilarni keyinchalik namunalarni moslashtirish vaqtida qayta ishlatish uchun saqlashdir. Qo'lga olingan guruhdagi barcha belgilar naqshni qidirishda bir butun sifatida ko'rib chiqiladi.
Quyidagi kod manba matndagi belgilar ketma-ketligining barcha holatlarini quyidagi bilan almashtirish uchun appendReplacement(StringBuffer sb, String replacement)va usullarini chaqiradi : appendTail(StringBuffer sbcatcaterpillar
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
   m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
O'zgartirilgan matnda qo'lga kiritilgan guruh va unga havoladan foydalanish dasturga erpillarhar bir sodir bo'lgandan keyin kiritish kerakligini aytadi cat. Ushbu kodni bajarish natijasi quyidagicha ko'rinadi: one caterpillar, two caterpillars, or three caterpillars on a fence

Matnni almashtirish

Sinf Matcherbizga matnni almashtirishning ikkita usulini taqdim etadi appendReplacement(StringBuffer sb, String replacement). Ushbu usullardan foydalanib, siz [almashtirilgan matn] birinchi marta yoki barcha hodisalarni almashtirishingiz mumkin:
  • Usul String replaceFirst(String replacement)moslashtiruvchini qayta o'rnatadi, yangi ob'ekt yaratadi String, mos keluvchi matnning barcha belgilarini (birinchi o'yingacha) ushbu satrga ko'chiradi, belgilarni oxirigacha qo'shadi replacement, qolgan belgilarni satrga ko'chiradi va ob'ekt String(satrda replacementdollar belgilari va olingan guruh raqamlari yordamida oldingi qidiruv matn ketma-ketligida olinganlarga havolalar bo'lishi mumkin).

  • Usul String replaceAll(String replacement)usulga o'xshash ishlaydi String replaceFirst(String replacement), lekin replacementbarcha topilgan mosliklarni satrdagi belgilar bilan almashtiradi.

Muntazam ifoda \s+kiritilgan matnda bir yoki bir nechta bo'shliq belgilarini qidiradi. Quyida biz ushbu oddiy ifodadan foydalanamiz va replaceAll(String replacement)takroriy bo'shliqlarni olib tashlash usulini chaqiramiz:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем      \t\t лишние пробелы.   ");
System.out.println(m.replaceAll(" "));
Natijalar: Удаляем лишние пробелы. 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