Кармалган топтор менен иштөө ыкмалары
Колдонмонун булак codeуRegexDemo
ыкма чакыруусун камтыйт m.group()
. Метод басып алынган топтор менен иштөөгө багытталган group()
класстын бир нече ыкмаларынын бири :Matcher
-
Метод
int groupCount()
чечүүчү үлгүдөгү басып алынган топтордун санын кайтарат. Бул сан бүтүндөй үлгүгө туура келген 0 номерлүү атайын басып алуу тобун эске алbyte. -
Метод
String group()
мурунку табылган матчтын символдорун кайтарат. Бош сапты ийгorктүү издөө жөнүндө кабарлоо үчүн, бул ыкма бош сапты кайтарат. Эгерде чечүүчү издөөнү аткара элек болсо же мурунку издөө операциясы ишке ашпай калса, өзгөчө жагдай чыгарылат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 китепканасы.Кадимки сөз айкаштары жана documentтер
Профессионалдык программалык камсыздоону иштеп чыгууда documentтештирүү милдеттүү милдеттердин бири болуп саналат. Бактыга жараша, туруктуу сөз айкаштары documentтерди түзүүнүн көптөгөн аспектилери менен жардам берет. Листинг 1деги code булак файлынан бир саптуу жана көп саптуу С стorндеги комментарийлерди камтыган саптарды чыгарып, башка файлга жазат. Код иштеши үчүн комментарийлер бир сапта болушу керек. Листинг 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()
адегенде туура буйрук сабынын синтаксисин текшерет, андан кийин класс an objectисинде бир жана көп саптуу комментарийлерди аныктоо үчүн иштелип чыккан кадимки туюнтманы түзөт Pattern
. Эгерде эч кандай өзгөчөлүк болбосо PatternSyntaxException
, ыкма main()
баштапкы файлды ачат, максаттуу файлды түзөт, үлгүгө окулган ар бир сапка дал келүү үчүн дал келүүчүнү алат, андан кийин булак файлын сап боюнча окуйт. Ар бир сап үчүн ал комментарий үлгүсү менен дал келет. Ийгorктүү болсо, метод main()
сапты (артынан жаңы сап менен) максаттуу файлга жазат (келечектеги Java 101 окуу куралында файлдын I/O логикасын карайбыз). Тизме 1ди төмөнкүдөй түзүңүз: javac ExtCmnt.java
Файл менен тиркемени ExtCmnt.java
киргизүү катары иштетиңиз: java ExtCmnt ExtCmnt.java out
Файлдан төмөнкү натыйжаларды алышыңыз керек:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
Үлгү сапта .*/\\*.*\\*/|.*//.*$
түтүк мета символу |
логикалык ЖЕ операторунун ролун аткарып, дал келүүчү тексттен дал келүүнү табуу үчүн дал келүүчү берилген регулярдуу туюнтма конструкциясынын сол операндын колдонушу керек экенин көрсөтүп турат. Эгерде дал келүүлөр жок болсо, дал келүүчү башка издөө аракети үчүн берилген регулярдуу туюнтма түзүмүндөгү оң операндды колдонот (картылган топтун кашаа мета символдору да логикалык операторду түзөт). Java тorндеги кадимки туюнтмалар, 5-бөлүк
GO TO FULL VERSION