Qo'lga olingan guruhlar bilan ishlash usullari
Ilovaning manba kodiRegexDemo
usul chaqiruvini o'z ichiga oladi m.group()
. Usul qo'lga olingan guruhlar bilan ishlashga qaratilgan group()
sinfning bir nechta usullaridan biridir :Matcher
-
Usul
int groupCount()
rezolyutsiya sxemasida olingan guruhlar sonini qaytaradi. Bu raqam 0-sonli maxsus qo'lga olish guruhini hisobga olmaydi, bu umuman naqshga mos keladi. -
Usul
String group()
oldingi topilgan mos belgilarni qaytaradi. Bo'sh qatorni muvaffaqiyatli qidirish haqida xabar berish uchun bu usul bo'sh qatorni qaytaradi. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
String group(int group)
avvalgi usulga o'xshaydi, bundan tashqari, u parametr tomonidan ko'rsatilgan guruh raqami tomonidan olingan oldingi topilgan mos keladigan belgilarni qaytaradigroup
. E'tibor bering, bugroup(0)
ga tenggroup()
. Agar shablonda berilgan raqam bilan olingan guruh bo'lmasa, usul istisno qiladiIndexOutOfBoundsException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
String group(String name)
nom guruhi tomonidan qo'lga kiritilgan oldingi mos keladigan belgilarni qaytaradi. Agar qo'lga kiritilgan guruh nomi shablonda bo'lmasa, istisno chiqariladiIllegalArgumentException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
.
groupCount()
Quyidagi misol va usullaridan foydalanishni ko'rsatadi group(int group)
:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Amalga oshirish natijalari:
3
0: abc
1: abc
2: bc
3: c
O'yin pozitsiyalarini aniqlash usullari
SinfMatcher
o'yinning boshlang'ich va yakuniy pozitsiyalarini qaytaradigan bir nechta usullarni taqdim etadi:
-
Usul
int start()
avvalgi topilgan o'yinning boshlang'ich pozitsiyasini qaytaradi. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
int start(int group)
avvalgi usulga o'xshaydi, lekin soni parametr bilan ko'rsatilgan guruh uchun topilgan oldingi moslikning boshlang'ich pozitsiyasini qaytaradigroup
. Agar shablonda berilgan raqamga ega bo'lgan guruh bo'lmasa, usul istisno qiladiIndexOutOfBoundsException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
int start(String name)
avvalgi usulga o'xshaydi, lekin deb nomlangan guruh uchun oldingi o'yinning boshlang'ich pozitsiyasini qaytaradiname
. Agar qo'lga olingan guruhname
shablonda bo'lmasa, istisno chiqariladiIllegalArgumentException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
int end()
oldingi topilgan moslikning oxirgi belgisi o'rnini va 1 qo'shimchasini qaytaradi. Agar mos keluvchi hali o'yinni bajarmagan bo'lsa yoki oldingi qidiruv operatsiyasi bajarilmasa, istisno chiqariladiIllegalStateException
. -
Usul
int end(int group)
avvalgi usulga o'xshaydi, lekin soni parametr bilan ko'rsatilgan guruh uchun oldingi moslikning yakuniy pozitsiyasini qaytaradigroup
. Agar shablonda berilgan raqam bilan olingan guruh bo'lmasa, usul istisno qiladiIndexOutOfBoundsException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
. -
Usul
int end(String name)
avvalgi usulga o'xshaydi, lekin deb nomlangan guruh uchun topilgan oldingi o'yinning yakuniy pozitsiyasini qaytaradiname
. Agar qo'lga olingan guruhname
shablonda bo'lmasa, istisno chiqariladiIllegalArgumentException
. Agar hal qiluvchi hali qidirishni amalga oshirmagan bo'lsa yoki oldingi qidiruv operatsiyasi muvaffaqiyatsiz tugasa, istisno chiqariladiIllegalStateException
.
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
System.out.println("Найдено " + m.group(2));
System.out.println(" начинается с позиции " + m.start(2) +
" и заканчивается на позиции " + (m.end(2) - 1));
System.out.println();
}
Ushbu misolning natijasi quyidagicha:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
PatternSyntaxException sinfining usullari
Sinf namunasiPatternSyntaxException
muntazam ifodadagi sintaksis xatosini tasvirlaydi. Metodlar compile()
va matches()
sinfdan bunday istisnoni tashlaydi Pattern
va quyidagi konstruktor orqali hosil bo'ladi: PatternSyntaxException(String desc, String regex, int index)
Bu konstruktor belgilangan tavsifni ( desc
), muntazam ifodani ( regex
) va sintaksis xatosi sodir bo'lgan pozitsiyani saqlaydi. Sintaksis xatosining joylashuvi noma'lum bo'lsa, qiymat index
ga o'rnatiladi -1
. Ehtimol, siz hech qachon nusxalarini yaratishingiz shart emas PatternSyntaxException
. Biroq, formatlangan xato xabarini yaratishda yuqoridagi qiymatlarni chiqarib olishingiz kerak bo'ladi. Buning uchun siz quyidagi usullardan foydalanishingiz mumkin:
- Usul
String getDescription()
sintaksis xatosining tavsifini qaytaradi. - Usul
int getIndex()
xato sodir bo'lgan pozitsiyani yoki pozitsiya noma'lum bo'lsa -1ni qaytaradi. - Usul
String getPattern()
yaroqsiz muntazam ifodani qaytaradi.
String getMessage()
oldingi usullardan qaytarilgan qiymatlar bilan ko'p qatorli qatorni qaytaradi va shablonda sintaksis xatosi qaerda sodir bo'lganligini vizual ko'rsatadi. Sintaksis xatosi nima? Mana bir misol: java RegexDemo (?itree Treehouse
Bu holda biz )
ichki bayroq ifodasida yopish qavs meta-belgisini ( ) belgilashni unutdik. Bu xatolikdan chiqadigan narsa:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Regex API yordamida foydali oddiy ifoda ilovalarini yarating
Oddiy iboralar matnni qayta ishlash uchun kuchli ilovalar yaratish imkonini beradi. Ushbu bo'limda biz sizga Regex API sinflari va usullarini yanada o'rganishga undaydigan ikkita qulay dasturni ko'rsatamiz. Ikkinchi ilova Lexan bilan tanishtiradi: leksik tahlil qilish uchun qayta foydalanish mumkin bo'lgan kodlar kutubxonasi.Oddiy iboralar va hujjatlar
Hujjatlar professional dasturiy ta'minotni ishlab chiqishda majburiy vazifalardan biridir. Yaxshiyamki, muntazam iboralar sizga hujjatlarni yaratishning ko'p jihatlarida yordam berishi mumkin. Listing 1-dagi kod bir qatorli va ko'p qatorli C uslubidagi izohlarni o'z ichiga olgan qatorlarni manba faylidan chiqaradi va ularni boshqa faylga yozadi. Kod ishlashi uchun sharhlar bir xil satrda bo'lishi kerak. Listing 1. Sharhlarni olishimport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class ExtCmnt
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("Способ применения: java ExtCmnt infile outfile");
return;
}
Pattern p;
try
{
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
}
catch (PatternSyntaxException pse)
{
System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
System.err.printf("Описание ошибки: %s%n", pse.getDescription());
System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
return;
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
Matcher m = p.matcher("");
String line;
while ((line = br.readLine()) != null)
{
m.reset(line);
if (m.matches()) /* Должна соответствовать вся строка */
{
bw.write(line);
bw.newLine();
}
}
}
catch (IOException ioe)
{
System.err.println(ioe.getMessage());
return;
}
}
}
Listing 1-dagi usul main()
birinchi navbatda to'g'ri buyruq qatori sintaksisini tekshiradi va keyin sinf ob'ektidagi bir va ko'p qatorli sharhlarni aniqlash uchun mo'ljallangan muntazam ifodani kompilyatsiya qiladi Pattern
. Agar istisno ko'tarilmasa PatternSyntaxException
, usul main()
manba faylini ochadi, maqsadli faylni yaratadi, o'qilgan har bir satrni naqshga moslashtirish uchun moslashtiruvchini oladi va keyin manba faylni satr bo'yicha o'qiydi. Har bir satr uchun u sharh namunasi bilan mos keladi. Muvaffaqiyatli bo'lsa, usul main()
maqsad faylga satrni (keyin yangi qator) yozadi (biz kelajakdagi Java 101 qo'llanmasida fayl kiritish/chiqarish mantiqini ko'rib chiqamiz). Listing 1 ni quyidagicha kompilyatsiya qiling: javac ExtCmnt.java
Ilovani fayl bilan ExtCmnt.java
kirish sifatida ishga tushiring: java ExtCmnt ExtCmnt.java out
Fayl chiqarishda quyidagi natijalarni olishingiz kerak:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
Naqsh qatorida .*/\\*.*\\*/|.*//.*$
quvur meta-belgi |
mantiqiy OR operatori vazifasini bajaradi, bu moslashtiruvchi matnda moslikni topish uchun berilgan muntazam ifoda konstruktsiyasining chap operandidan foydalanishi kerakligini ko'rsatadi. Agar mos kelmaydigan bo'lsa, mos keluvchi boshqa qidiruv urinishi uchun berilgan muntazam ifoda konstruktsiyasidan to'g'ri operanddan foydalanadi (qo'lga olingan guruhdagi qavs meta-belgilari ham mantiqiy operatorni tashkil qiladi). Java tilidagi oddiy iboralar, 5-qism
GO TO FULL VERSION