Regex API көмегімен жалпы бағдарламалау тапсырмаларын жеңілдетіңіз
Осы мақаланың 1 және 2 бөлімдерінде сіз тұрақты өрнектермен және Regex API интерфейсімен таныстыңыз. Сіз сынып туралы білдіңізPattern
және тұрақты өрнек конструкцияларын көрсететін мысалдарды араладыңыз, әріптік жолдарды пайдаланып қарапайым үлгі сәйкестендіруден ауқымдар, шекара сәйкестіктері және кванторлар арқылы күрделірек сәйкестікке дейін. Осы және келесі бөлімдерде біз бірінші бөлімде қарастырылмаған мәселелерді қарастырамыз, біз сабақтардың сәйкес әдістерін зерттейміз Pattern
және Matcher
. Сондай-ақ қарапайым бағдарламалау мәселелерін жеңілдету үшін тұрақты өрнектердіPatternSyntaxException
пайдаланатын екі утorтаны үйренесіз . Біріншісі құжаттама үшін codeтан түсініктемелерді шығарады. Екіншісі – лексикалық талдауды орындауға арналған қайта пайдалануға болатын code кітапханасы – ассемблерлердің, компиляторлардың және ұқсас бағдарламалық қамтамасыз етудің маңызды құрамдас бөлігі.
КӨЗ КОДЫН ЖҮКТЕП АЛУ
Осы мақаладағы демонстрациялық қолданбаларға арналған барлық бастапқы codeты (JavaWorld үшін Джефф Фризен жасаған) осы жерден ала аласыз .Regex API үйрену
Pattern
, Matcher
және PatternSyntaxException
Regex API құрайтын үш сынып. Олардың әрқайсысы codeта тұрақты өрнектерді пайдалануға мүмкіндік беретін әдістерді ұсынады.
Pattern класының әдістері
Класс данасыPattern
- үлгі ретінде белгілі құрастырылған тұрақты өрнек. Үлгіні сәйкестендіру операцияларының өнімділігін жақсарту үшін тұрақты өрнектер құрастырылады. Келесі статикалық әдістер компиляцияны қолдайды.
Pattern compile(String regex)
мазмұндыregex
жаңада сақталатын аралық көрініске құрастырадыPattern
. Бұл әдіс сәтті болса нысанға сілтемені қайтарады немесеPatternSyntaxException
жарамсыз қалыпты өрнек синтаксисі анықталса, ерекше жағдайды шығарады.Matcher
Осы нысан пайдаланатын немесе одан қайтарылған сыныптың кез келген нысаныPattern
өзінің әдепкі параметрлерін пайдаланады, мысалы, регистрді ескеретін іздеу. Мысал ретінде, code үзіндісі нүктелік таңбадан басталатын жолдарды сәйкестендіру үшін тұрақты өрнектің құрастырылған көрінісін сақтайтынPattern p = Pattern.compile("(?m)^\\.");
нысанды жасайды .Pattern
Pattern compile(String regex, int flags)
сияқты мәселені шешедіPattern compile(String regex)
, бірақ ескере отырыпflags
: OR түріндегі разрядтық жалаушалар үшін разрядтық константалар жиыны. Класс биттік НЕМЕСЕ (мысалы, ) арқылы біріктіруге және аргумент ретінде беруге болатынPattern
тұрақты мәндерді жариялайды .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
CASE_INSENSITIVE | DOTALL
flags
қоспағанда
CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS
, бұл тұрақты мәндер 1 бөлімде көрсетілген кірістірілген жалау өрнектеріне балама болып табылады. Егер сыныпта анықталғаннан басқа жалауша тұрақтысы кездессе Pattern
, әдіс Pattern compile(String regex, int flags)
ерекше жағдайды шығарады java.lang.IllegalArgumentException
. Мысалы, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);
алдыңғы мысалға тең, тұрақты Pattern.MULTILINE
және кірістірілген жалауша өрнегі (?m)
бірдей әрекетті жасайды.
Pattern
ол қолданатын жалаушалармен бірге көшірмесін алу қажет болады. Ол үшін келесі әдістерді шақыруға болады:
String pattern()
a түрінде құрастырылған бастапқы тұрақты өрнек жолын қайтарадыPattern
.int flags()
нысанның жалаушаларын қайтарадыPattern
.
Pattern
нысанды алу үшін пайдаланылады . Matcher
Әдіс нысан үлгісіне сәйкес мәтінді іздейтін Matcher matcher(Charsequence input)
нысанды жасайды . Шақырылған кезде ол осы нысанға сілтемені қайтарады . Мысалы, пәрмен айнымалымен сілтеме жасалған нысанды қайтарады . Matcher
input
Pattern
Matcher
Matcher m = p.matcher(args[1]);
Matcher
Pattern
p
Бір реттік іздеу |
---|
static boolean matches(String regex, CharSequence input) Класс әдісі нысандарды құруға және үлгіні пайдаланып бір реттік іздеуге Pattern үнемдеуге мүмкіндік береді . Бұл әдіс үлгі сәйкес келсе true мәнін қайтарады , әйтпесе ол жалған мәнін қайтарады. Тұрақты өрнекте синтаксистік қате болса, әдіс ерекше жағдайды шығарады . Мысалы, фраза тек бос орындар мен кіші әріптерден тұратынын растайтын басып шығарады .Pattern Matcher input regex PatternSyntaxException System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only")); true all lowercase letters and whitespace only |
Мәтінді бөлу
Көптеген әзірлеушілер мәтінге негізделген қызметкер тіркелгісін өрістер жинағына түрлендіру сияқты кіріс мәтінін оның құрамдас бөліктеріне бөлу үшін кемінде бір рет жазылған codeқа ие. СыныпPattern
мәтінді бөлудің екі әдісін қолдана отырып, бұл жалықтыратын тапсырманы ыңғайлырақ шешуге мүмкіндік береді:
-
Әдіс табылған сәйкестіктерге сәйкес нысан үлгісіне
String[] split(CharSequence text, int limit)
бөлінеді және нәтижелерді массивте қайтарады. Әрбір жиым элементі келесі реттіліктен үлгіге сәйкес мәтін фрагменті (немесе мәтіннің соңы) арқылы бөлінген мәтін тізбегін көрсетеді. Массивтің элементтері олар пайда болған ретпен болады .text
Pattern
text
Бұл әдісте массив элементтерінің саны параметрге байланысты болады
limit
, ол сонымен бірге табылатын сәйкестіктер санын басқарады.- Оң мән сәйкестіктен көп емес іздейді
limit-1
және массив ұзындығы элементтерден аспайдыlimit
. - Егер мән теріс болса, барлық мүмкін сәйкестіктер ізделеді және массивтің ұзындығы ерікті болуы мүмкін.
- Егер мән нөлге тең болса, барлық мүмкін сәйкестіктер ізделеді, массивтің ұзындығы ерікті болуы мүмкін және соңында бос жолдар жойылады.
- Оң мән сәйкестіктен көп емес іздейді
- Әдіс
String[] split(CharSequence text)
шек аргументі ретінде 0-мен алдыңғы әдісті шақырады және оның шақыруының нәтижесін қайтарады.
split(CharSequence text)
Төменде қызметкер шотын аты-жөні, жасы, пошталық мекенжайы және жалақысы бойынша бөлек өрістерге бөлу мәселесін шешу әдісінің нәтижелері келтірілген :
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]);
Жоғарыдағы code үтір таңбасынан кейін бірден бір бос орын таңбасын табу үшін тұрақты өрнекті сипаттайды. Міне, оның орындалу нәтижелері:
John Doe
47
Hillsboro Road
32000
Үлгі предикаттар және Streams API
Java 8-де сыныптаPattern
әдіс пайда болды . Бұл әдіс үлгіні сәйкестендіру үшін қолданылатын предикатты (логикалық мәні бар функция) жасайды. Бұл әдісті пайдалану келесі code үзіндісінде көрсетілген: 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);
Бұл code бағдарламалау тілі атауларының тізімін жасайды, содан кейін әрпінен басталатын барлық атауларды табу үшін үлгіні құрастырады c
. Жоғарыдағы codeтың соңғы жолы дереккөз ретінде осы тізіммен бірге деректердің сериялық ағынын қабылдауды жүзеге асырады. asPredicate()
Ол ат әріптен басталғанда ақиқат мәнін қайтаратын c
және ағын арқылы қайталанатын, сәйкес атауларды стандартты шығысқа басып шығаратын логикалық функцияны пайдаланып сүзгіні орнатады . Бұл соңғы жол 1-бөлімдегі RegexDemo қолданбасынан таныс келесі тұрақты циклге баламалы:
for (String progLang: progLangs)
if (p.matcher(progLang).find())
System.out.println(progLang);
Сәйкестендіру класының әдістері
Сынып данасыMatcher
сыныптың құрастырылған тұрақты өрнекті интерпретациялау арқылы таңбалар тізбегінде үлгіні сәйкестендіру операцияларын орындау механизмін сипаттайды Pattern
. Класс an objectілері Matcher
үлгіні іздеу әрекеттерінің әртүрлі түрлерін қолдайды:
-
Әдіс
boolean find()
келесі сәйкестік үшін енгізілген мәтінді іздейді. Бұл әдіс сканерлеуді көрсетілген мәтіннің басында немесе алдыңғы сәйкестіктен кейінгі бірінші таңбадан бастайды. Екінші опция осы әдіске алдыңғы шақыру ақиқат болып қайтарылған және шешуші қалпына келтірілмеген жағдайда ғана мүмкін болады. Кез келген жағдайда, іздеу сәтті болса, логикалық мән true қайтарылады. Бұл әдістің мысалынRegexDemo
1 бөлімнен табуға болады. -
Әдіс
boolean find(int start)
сәйкестікті қалпына келтіреді және келесі сәйкестік үшін мәтінді іздейді. Қарау параметрмен көрсетілген орыннан басталадыstart
. Іздеу сәтті болса, логикалық мән true қайтарылады. Мысалы,m.find(1);
мәтінді позициядан бастап сканерлейді1
(0 позициясы еленбейді). Егер параметрдеstart
теріс мән немесе сәйкестік мәтін ұзындығынан үлкен мән болса, әдіс ерекше жағдайды шығарадыjava.lang.IndexOutOfBoundsException
. -
Әдіс
boolean matches()
барлық мәтінді үлгіге сәйкестендіруге әрекет жасайды. Барлық мәтін үлгіге сәйкес келсе, ол логикалық мәнді true қайтарады. Мысалы, code таңба сөз таңбасы болмағандықтанPattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());
шығады .false
!
-
Әдіс
boolean lookingAt()
көрсетілген мәтінді үлгімен сәйкестендіруге тырысады. Бұл әдіс мәтіннің кез келген бөлігі үлгіге сәйкес келсе, true мәнін қайтарады. Әдістен айырмашылығыmatches();
, барлық мәтін үлгіге сәйкес келмеуі керек. Мысалы, мәтіннің басы тек сөз құраушы таңбалардан тұратындықтан ,Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());
ол шығарады .true
abc!
Pattern
, сынып нысандары Matcher
күй ақпаратын сақтайды. Кейде үлгіні іздеу аяқталғаннан кейін бұл ақпаратты өшіру үшін сәйкестікті қалпына келтіру қажет болуы мүмкін. Түзеткішті қалпына келтіру үшін келесі әдістер қол жетімді:
-
Әдіс
Matcher reset()
сәйкестік күйін, соның ішінде соңына қосылатын орынды қалпына келтіреді (0-ге қайта орнату). Келесі үлгіні іздеу әрекеті сәйкестік мәтінінің басынан басталады. Ағымдағы нысанға сілтемені қайтарадыMatcher
. Мысалы,m.reset();
сілтеме жасаған шешушіні қалпына келтіредіm
. -
Әдіс
Matcher reset(CharSequence text)
шешуші күйін қалпына келтіреді және жаңа шешуші мәтінді параметріне орнатадыtext
. Келесі үлгіні іздеу әрекеті жаңа сәйкестік мәтінінің басынан басталады. Ағымдағы нысанға сілтемені қайтарадыMatcher
. Мысалы,m.reset("new text");
сілтеме жасалған шешу құралын қалпына келтіредіm
және жаңа шешуші мәтінді параметріне орнатады"new text"
.
Мәтінді соңына қосу
Соңына қосылатын сәйкестік орны нысан нысанының соңына қосылатын сәйкестік мәтінінің басын көрсетедіjava.lang.StringBuffer
. Бұл позицияны келесі әдістер пайдаланады:
-
Әдіс сәйкестендіруші мәтін таңбаларын оқиды және оларды аргумент арқылы сілтеме жасалған
Matcher appendReplacement(StringBuffer sb, String replacement)
нысанның соңына қосады . Бұл әдіс алдыңғы үлгі сәйкестігінің алдындағы соңғы таңбада оқуды тоқтатады. Әрі қарай, әдіс аргумент арқылы сілтеме жасалған нысанның таңбаларын нысанның соңына қосады (жолда алдыңғы іздеу кезінде түсірілген мәтін тізбегіне сілтемелер болуы мүмкін; олар түсірілетін таңбалар мен топ нөмірлері арқылы көрсетіледі). Соңында, әдіс соңғы сәйкестендірілген таңбаның орнына қосылатын сәйкестік орнының мәнін орнатады және бір плюс, содан кейін ағымдағы сәйкестендірушіге сілтемені қайтарады.StringBuffer
sb
String
replacement
StringBuffer
replacement
($)
-
Әдіс
StringBuffer appendTail(StringBuffer sb)
барлық мәтінді нысанға қосадыStringBuffer
және сол нысанға сілтемені қайтарады. Соңғы әдісті шақырғаннан кейін қалған мәтінді нысанға көшіруappendReplacement(StringBuffer sb, String replacement)
әдісін шақырыңыз .appendTail(StringBuffer sb)
StringBuffer
Сәйкестендіруші әлі сәйкестікті таппаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, әдіс Matcher appendReplacement(StringBuffer sb, String replacement)
ерекше жағдайды шығарады . Егер сызық үлгіде жоқ түсіру тобын көрсетсе, java.lang.IllegalStateException
ол ерекше жағдайды шығарады ).IndexOutOfBoundsException
replacement
Түсірілген топтар |
---|
1-бөлімнен есіңізде болса, түсіру тобы жақшаға ( ) метатаңбаларға алынған таңбалар тізбегі болып табылады () . Бұл құрылымның мақсаты үлгіні сәйкестендіру кезінде кейінірек қайта пайдалану үшін табылған таңбаларды сақтау болып табылады. Үлгіні іздеу кезінде түсірілген топтың барлық таңбалары біртұтас ретінде қарастырылады. |
appendReplacement(StringBuffer sb, String replacement)
және әдістерін шақырады : appendTail(StringBuffer sb
cat
caterpillar
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);
Ауыстыру мәтінінде түсірілген топты және оған сілтемені пайдалану бағдарламаға erpillar
әрбір пайда болғаннан кейін кірістіру керектігін айтады cat
. Бұл codeты орындау нәтижесі келесідей болады: one caterpillar, two caterpillars, or three caterpillars on a fence
Мәтінді ауыстыру
СыныпMatcher
бізге мәтінді ауыстырудың екі әдісін ұсынады appendReplacement(StringBuffer sb, String replacement)
. Осы әдістерді пайдалана отырып, сіз [алмастырылған мәтіннің] бірінші пайда болуын немесе барлық көріністерді ауыстыра аласыз:
-
Әдіс
String replaceFirst(String replacement)
сәйкестікті қалпына келтіреді, жаңа нысан жасайдыString
, сәйкестік мәтінінің барлық таңбаларын (бірінші сәйкестікке дейін) осы жолға көшіреді, таңбаларды оның соңына дейін қосадыreplacement
, қалған таңбаларды жолға көшіреді және қайтарады нысанString
(жолдаreplacement
доллар таңбалары мен түсірілген топ нөмірлері арқылы алдыңғы іздеу мәтіні реттілігі кезінде түсірілген сілтемелер болуы мүмкін). -
Әдіс
String replaceAll(String replacement)
әдісіне ұқсас жұмыс істейдіString replaceFirst(String replacement)
, бірақreplacement
барлық табылған сәйкестіктерді жолдағы таңбалармен ауыстырады.
\s+
енгізу мәтініндегі бір немесе бірнеше бос орын таңбаларын іздейді. Төменде біз осы тұрақты өрнекті қолданамыз және replaceAll(String replacement)
қайталанатын бос орындарды жою әдісін шақырамыз:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем \t\t лишние пробелы. ");
System.out.println(m.replaceAll(" "));
Міне нәтижелер: Удаляем лишние пробелы.
Java тіліндегі тұрақты өрнектер, 4-бөлім Java тіліндегі тұрақты өрнектер, 5-бөлім
GO TO FULL VERSION