Ұсталған топтармен жұмыс істеу әдістері
Қолданбаның бастапқы codeыRegexDemo
әдіс шақыруын қамтиды m.group()
. Әдіс - ұсталған топтармен жұмыс істеуге бағытталған group()
сыныптың бірнеше әдістерінің бірі :Matcher
-
Әдіс
int groupCount()
шешуші үлгісіндегі түсірілген топтардың санын қайтарады. Бұл сан тұтастай үлгіге сәйкес келетін арнайы түсіру тобының 0 нөмірін есепке алмайды. -
Әдіс
String group()
алдыңғы табылған сәйкестіктің таңбаларын қайтарады. Бос жолды сәтті іздеу туралы хабарлау үшін бұл әдіс бос жолды қайтарады. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
String group(int group)
алдыңғы әдіске ұқсас, тек ол параметрмен көрсетілген топ нөмірі арқылы түсірілген алдыңғы сәйкестіктің таңбаларын қайтарадыgroup
. Бұлgroup(0)
сәйкес келетініне назар аударыңызgroup()
. Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарадыIndexOutOfBoundsException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
String group(String name)
атау тобымен түсірілген алдыңғы сәйкестіктің таңбаларын қайтарады. Түсірілген топ атауы үлгіде болмаса, ерекше жағдай шығарыладыIllegalArgumentException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
.
groupCount()
Келесі мысал және әдістерінің қолданылуын көрсетеді 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));
Орындау нәтижелері:
3
0: abc
1: abc
2: bc
3: c
Сәйкестік позицияларын анықтау әдістері
КлассMatcher
сәйкестіктің бастапқы және соңғы орындарын қайтаратын бірнеше әдістерді ұсынады:
-
Әдіс
int start()
алдыңғы табылған сәйкестіктің бастапқы орнын қайтарады. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
int start(int group)
алдыңғы әдіске ұқсас, бірақ саны параметрмен көрсетілген топ үшін табылған алдыңғы сәйкестіктің бастапқы орнын қайтарадыgroup
. Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарадыIndexOutOfBoundsException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
int start(String name)
алдыңғы әдіске ұқсас, бірақ деп аталатын топ үшін табылған алдыңғы сәйкестіктің бастапқы орнын қайтарадыname
. Егер түсірілген топname
үлгіде болмаса, ерекше жағдай шығарыладыIllegalArgumentException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
int end()
алдыңғы табылған сәйкестіктің соңғы таңбасының орнын және 1 санын қайтарады. Сәйкестік әлі сәйкестікті орындамаса немесе алдыңғы іздеу әрекеті сәтсіз болса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
int end(int group)
алдыңғы әдіске ұқсас, бірақ саны параметрмен көрсетілген топ үшін табылған алдыңғы сәйкестіктің аяқталу орнын қайтарадыgroup
. Үлгіде берілген нөмірмен түсірілген топ болмаса, әдіс ерекше жағдайды шығарадыIndexOutOfBoundsException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
. -
Әдіс
int end(String name)
алдыңғы әдіске ұқсас, бірақ деп аталатын топ үшін табылған алдыңғы сәйкестіктің аяқталу орнын қайтарадыname
. Егер түсірілген топname
үлгіде болмаса, ерекше жағдай шығарыладыIllegalArgumentException
. Егер шешуші әлі іздеуді орындамаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, ерекше жағдай шығарыладыIllegalStateException
.
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();
}
Бұл мысалдың нәтижесі келесідей:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
PatternSyntaxException класының әдістері
Сынып данасыPatternSyntaxException
тұрақты өрнектегі синтаксистік қатені сипаттайды. Мұндай ерекшелікті әдістер compile()
мен matches()
сыныптан шығарады Pattern
және келесі конструктор арқылы қалыптасады: PatternSyntaxException(String desc, String regex, int index)
Бұл конструктор көрсетілген сипаттаманы ( desc
), тұрақты өрнекті ( regex
) және синтаксистік қате орын алған орынды сақтайды. Синтаксистік қатенің орны белгісіз болса, мән мәніне index
орнатылады -1
. Сірә, сізге ешқашан даналарын жасаудың қажеті болмайды PatternSyntaxException
. Дегенмен, пішімделген қате туралы хабарды жасаған кезде жоғарыдағы мәндерді шығарып алуыңыз керек. Ол үшін келесі әдістерді қолдануға болады:
- Әдіс
String getDescription()
синтаксистік қатенің сипаттамасын береді. - Әдіс
int getIndex()
қате орын алған орынды немесе позиция белгісіз болса -1 қайтарады. - Әдіс
String getPattern()
жарамсыз тұрақты өрнекті қайтарады.
String getMessage()
үлгідегі синтаксистік қатенің қай жерде орын алғанының көрнекі көрсеткішімен бірге алдыңғы әдістерден қайтарылған мәндері бар көп жолды жолды қайтарады. Синтаксистік қате дегеніміз не? Міне мысал: Бұл жағдайда біз кірістірілген жалауша өрнегінде java RegexDemo (?itree Treehouse
жабу жақша метатаңбасын ( ) көрсетуді ұмытып кеттік . )
Бұл қатеден шығатын нәрсе:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Regex API арқылы пайдалы тұрақты өрнек қолданбаларын құрастырыңыз
Тұрақты өрнектер қуатты мәтінді өңдеу қолданбаларын жасауға мүмкіндік береді. Бұл бөлімде біз сізге Regex API сыныптары мен әдістерін одан әрі зерттеуге шақыратын екі ыңғайлы қолданбаны көрсетеміз. Екінші қосымшада Lexan: лексикалық талдауды орындауға арналған қайта пайдалануға болатын code кітапханасы енгізілген.Тұрақты өрнектер және құжаттама
Кәсіби бағдарламалық қамтамасыз етуді әзірлеу кезінде құжаттамалық қамтамасыз ету міндетті міндеттердің бірі болып табылады. Бақытымызға орай, тұрақты өрнектер құжаттаманы жасаудың көптеген аспектілерімен көмектесе алады. 1-тізімдегі code бастапқы файлдан бір жолды және көп жолды C стиліндегі түсініктемелерді қамтитын жолдарды шығарып, оларды басқа файлға жазады. Код жұмыс істеуі үшін түсініктемелер бір жолда болуы керек. Листинг 1. Түсініктемелерді алуimport 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;
}
}
}
1-тізімдегі әдіс main()
алдымен пәрмен жолы синтаксисінің дұрыстығын тексереді, содан кейін сынып нысанындағы бір және көп жолды түсініктемелерді анықтауға арналған тұрақты өрнекті құрастырады Pattern
. Ешбір ерекшелік туындамаса PatternSyntaxException
, әдіс main()
бастапқы файлды ашады, мақсатты файлды жасайды, үлгіге қарсы оқылған әрбір жолды сәйкестендіру үшін сәйкестікті алады, содан кейін бастапқы файлды жол бойынша оқиды. Әрбір жол үшін ол түсініктеме үлгісімен сәйкестендіріледі. Сәтті болса, әдіс main()
мақсатты файлға жолды (жаңа жолдан кейін) жазады (біз болашақ Java 101 оқулығында файл енгізу/шығару логикасын қарастырамыз). 1-тізімді төмендегідей құрастырыңыз: javac ExtCmnt.java
Қолданбаны файлмен ExtCmnt.java
кіріс ретінде іске қосыңыз: java ExtCmnt ExtCmnt.java out
Файлдан келесі нәтижелерді алуыңыз керек:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
Үлгі жолында .*/\\*.*\\*/|.*//.*$
құбыр метатаңбасы |
логикалық НЕМЕСЕ операторы ретінде әрекет етеді, бұл сәйкестендіруші сәйкестік мәтінінде сәйкестікті табу үшін берілген тұрақты өрнек конструкциясының сол жақ операндын пайдалану керектігін көрсетеді. Сәйкестіктер болмаса, сәйкестік басқа іздеу әрекеті үшін берілген тұрақты өрнек конструкциясынан дұрыс операндты пайдаланады (түсірілген топтағы жақша метатаңбалары да логикалық операторды құрайды). Java тіліндегі тұрақты өрнектер, 5-бөлім
GO TO FULL VERSION