Тұрақты тіркестер туралы оқуымызды жалғастырайық. Бұл мақалада біз алдын ала анықталған таңбалар кластарын, сондай-ақ сандық бағалауды (тізбектерді іздеу) қарастырамыз.
Бұл кестеде сол жақ бағандағы конструкциялар оң жақ бағандағы өрнектердің стенографиялық көрінісі болып табылады. Мысалы, ![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 3 бөлім]()
Алғашқы үш мысалда тұрақты өрнек жай ғана "
Кванторлар жолдағы символдың қайталану санын анықтауға мүмкіндік береді. Ашкөз, жалқау және өте ашкөз кванторлардың қалай жұмыс істейтінін егжей-тегжейлі қарастырайық. Бір қарағанда X?, X?? кванторлары болып көрінуі мүмкін. және X?+ бірдей жұмыс істейді: «X бір рет бар немесе мүлде жоқ». Бұл кванторларды жүзеге асыруда шамалы айырмашылықтар бар, біз оларды төменде қарастырамыз.
Жоғарыдағы мысалда іздеу алғашқы екі жағдайда сәтті болды, себебі a? және a* жолда а таңбасының болмауына мүмкіндік береді. Сондай-ақ, бастапқы және соңғы сәйкестік индексі бірдей (0) екенін ескеріңіз. Енгізу жолының ұзындығы болмағандықтан, бағдарлама бірінші орында ештеңе таба алмайды :). Бұл жағдай нөлдік ұзындық сәйкестігі деп аталады. Мұндай сәйкестіктер бірнеше жағдайда болады: енгізу жолы бос болғанда, енгізу жолының басында, жолдың соңғы символынан кейін немесе жолдағы таңбалар арасында. Ұзындығы нөлдік сәйкестіктерді анықтау оңай: олар бір позицияда басталып, аяқталады. Нөлдік ұзындықтағы сәйкестіктердің тағы бірнеше мысалдарын қарастырайық. Нөлдік сәйкестіктерді тағы бірнеше мысалдармен зерттейік. Енгізу жолын «a» таңбасына өзгертіп, қызықты әсерді байқап көрейік:
Барлық үш кванторлар «a» таңбасын тапты, бірақ символдың болмауына мүмкіндік беретін алғашқы екеуі 1-позицияда нөлдік ұзындық сәйкестігін тапты. - жолдың соңғы символынан кейін. Бұл бағдарлама «a» таңбасын жол ретінде қарастырып, сәйкестіктер қалмайынша ол арқылы «жүгіреді» болғандықтан болады. Қолданылатын кванфикаторға байланысты бағдарлама жолдың соңында «ештеңе» табады немесе таппайды. Енді енгізу жолын бес әріптен тұратын «a» тізбегіне өзгертейік:
Тұрақты a өрнегі? жолдағы әр әріптің сәйкестігін бөлек табады. a* өрнегі екі сәйкестікті табады: "a"' таңбалар тізбегі және 5-позициядағы нөлдік ұзындық сәйкестік. Соңында, a+ тұрақты өрнек «ештеңе» таппай, тек «a» таңбалар тізбегін табады :) Егер кіріс ретінде әртүрлі таңбалардан тұратын жол берілсе не болады? Мысалы, "ababaaaab":
"b" таңбасы 1, 3 және 8 позицияларында және бағдарлама осы позицияларда нөлдік ұзындық сәйкестіктерін табады. Тұрақты өрнек a? «б»-ға мән бермейді, тек «а» таңбасының бар (немесе жоқтығын) іздейді. Егер квантор "a" болмауына мүмкіндік берсе, жолдағы "a"-дан басқа барлық таңбалар ұзындығы нөлдік сәйкестік ретінде көрсетіледі. Берілген ұзындықтағы тізбектерді табу үшін жай ғана ұзындықты бұйра жақшаларда көрсетіңіз:
a{3} тұрақты өрнегі үш "a" таңбасының тізбегін іздейді. Бірінші жолда ештеңе табылмады, себебі жолда а саны жеткіліксіз болды. Екіншісінде бағдарлама табатын 3 таңба бар. Үшінші сынақ жолдың басында сәйкестікті табады. 3-ші таңбадан кейінгі барлығы тұрақты өрнекті қанағаттандырмайды, төмендегі codeта ол сәйкес келеді және бірнеше сәйкестік болады:
Ең аз реттілік ұзындығын көрсету үшін мынаны пайдаланыңыз:
Бұл мысалда бірінші сәйкестік алтыншы таңбада аяқталды. Екінші сәйкестікте алтыншыдан кейінгі таңбалар бар, өйткені олар ең аз ұзындық талаптарын қанағаттандырады. Егер жол бір таңбаға қысқа болса, екінші сәйкестік болмас еді.
Бірінші мысалда бағдарлама сәйкестікті табады, өйткені квантор таңбалар тобына таралады. Жақшаларды алып тастасаңыз, {3} кванторы тек «g» әрпіне қолданылады. Сондай-ақ, таңба кластары бар кванторларды пайдалануға болады:
{3} кванторы бірінші мысалдағы жақшадағы таңбалар класына, ал екіншісінде тек “c” таңбасына қолданылады.
Бірінші мысал кез келген таңбаны табу үшін ашкөз .* кванторын пайдаланады, 0 немесе одан көп рет, одан кейін "f" "o" "o" таңбалары. Кантификатор ашкөз болғандықтан, табылған сәйкестікте бүкіл жол бар. Ашкөз кванфикатор жолда барлық сәйкестіктерді таба алмайды, өйткені бірінші қадамда бүкіл жолды сканерлегеннен кейін ол сәйкестікті тауып, жұмысты аяқтайды. Екінші мысал жалқау және жолдың басынан басталады, таңба бойынша таңба қосылады. Бағдарлама «бостықтың» бар-жоғын тексеруден басталады, бірақ содан бері "foo" тізбегі жолдың басында жоқ, іздеу "x" таңбасын қосумен жалғасады, содан кейін 0 және 4 индекстерінің арасында бірінші сәйкестік табылады. Іздеу жолдың соңына дейін жалғасады ал екінші сәйкестік 4 және 13 индекстерінің арасында болады. Үшінші мысал сәйкестіктерді таппайды, себебі квантор қызғаныш. Бұл жағдайда .*+ тұрақты өрнек «foo» үшін ештеңе қалдырмай, бүкіл жолды «жеді». Жолдағы қажетсіз кез келген нәрсені тастау қажет болғанда қызғаныш кванторын пайдаланыңыз, ол баламалы сараң кванторға қарағанда тиімдірек болады. Бар болғаны! Дереккөзге сілтеме: Java тіліндегі тұрақты өрнектердің негіздері. 3-бөлім
Алдын ала анықталған таңбалар кластары
API сыныбындаPattern
жиі қолданылатын тұрақты өрнектерге ыңғайлы таңбашалар ұсынатын алдын ала анықталған таңба сыныптары бар. \d
санды білдіреді (0-9), \w
кез келген бас немесе кіші әріпті, астын сызуды немесе санды білдіреді. Мүмкіндігінше алдын ала анықталған таңба сыныптарын пайдаланыңыз. Бұл codeты оқуды және қателерді түзетуді жеңілдетеді. Кері қиғаш сызықтан басталатын конструкциялар қашып шыққан немесе қорғалған деп аталады. \Q
Алдыңғы мақалаларда біз кері қиғаш сызықтары немесе таңбалары бар арнайы таңбалардан құтылу және \E
оларды кәдімгі таңбалар ретінде пайдалану туралы айтқан болатынбыз . Тұрақты таңбалармен (литералдар) кері қиғаш сызықты пайдалансаңыз, өрнек құрастыру үшін кері қиғаш сызықтан құтылу керек.
private final String REGEX = "\\d"; // цифра
Бұл мысалда \d
тұрақты өрнек; қосымша кері қиғаш сызық бағдарламаны құрастыру үшін қажет. Біздің сынақ бағдарламамыз тұрақты өрнектерді тікелей консольден оқиды, сондықтан қосымша қиғаш сызық қажет емес. Келесі мысал алдын ала анықталған таңба сыныптарын пайдалануды көрсетеді: ![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 3 бөлім](https://cdn.javarush.com/images/article/1b01383c-1811-4648-8923-b6987db5e19d/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 4 бөлім](https://cdn.javarush.com/images/article/4e1c1668-4406-4488-a2ab-17d0111c8aa6/1024.jpeg)
.
" (нүкте арнайы таңба), ол кез келген таңбаны білдіреді. Сондықтан іздеу барлық жағдайда сәтті болды. Басқа мысалдарда біз жоғарыдағы кестеде мәндерін талқылаған алдын ала анықталған таңба сыныптары қолданылады.
Кванторлар
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 4 бөлім](https://cdn.javarush.com/images/article/46bbc180-b0c7-4fd2-964a-d74319f7838b/1024.jpeg)
Нөлдік ұзындық сәйкес келеді
Ашкөзден бастайық. Үш түрлі тұрақты тіркесті жазайық: арнайы таңбалары бар «а» әрпі ?, * немесе +. Осы тұрақты тіркестерді бос жолда сынасақ не болатынын көрейік:![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 5 бөлім](https://cdn.javarush.com/images/article/2222afd9-7255-43ef-9c29-5ebfbc56aab9/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 6 бөлім](https://cdn.javarush.com/images/article/e1c808a7-5a1c-48a1-ada5-8e7398ce7711/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 7 бөлім](https://cdn.javarush.com/images/article/01af5247-7fa0-429a-b3ea-5a5a15ef1f7f/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 8 бөлім](https://cdn.javarush.com/images/article/015a8b48-4d89-4af1-987e-2a7cab1b62d3/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 9 бөлім](https://cdn.javarush.com/images/article/c871b787-760d-4a53-b3bd-6b04d4afd41e/1024.jpeg)
![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 10 бөлім](https://cdn.javarush.com/images/article/aac87994-bca7-414d-a7c1-aadf017c1281/1024.jpeg)
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Бұл мысалда бағдарлама тек бір сәйкестікті табады, себебі жол (3) «a» таңбаларының ең аз реттілік ұзындығы талабына сай келеді. Соңында, максималды реттілік ұзындығын орнату: ![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 11 бөлім](https://cdn.javarush.com/images/article/722ccf78-ee60-42b3-aae6-373aa310cc19/1024.jpeg)
Кванторлары бар таңбалар топтары мен кластарын пайдалану
Осы уақытқа дейін біз бірдей таңбадан тұратын жолдардағы кванторларды сынадық. Кванторлар тек бір таңбаға қолданылады, сондықтан «abc+» тұрақты өрнегі «ab» және «c» бар жолдарға бір немесе бірнеше рет сәйкес келеді. Бұл бір немесе бірнеше рет «abc» дегенді білдірмейді. Бірақ кванторларды [abc]+ (a немесе b немесе c, бір немесе бірнеше рет) немесе (abc)+ («abc» бір немесе бірнеше рет) сияқты топтармен және таңба сыныптарымен бірге пайдалануға болады. Бір қатарда үш рет таңбалар тобын (ит) табайық:![Java тіліндегі тұрақты өрнектердің негіздері. 3 - 12 бөлім](https://cdn.javarush.com/images/article/0414bbda-dd55-4ac1-af29-9dcf53b20c05/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 13](https://cdn.javarush.com/images/article/8477b7f2-fdd5-4f23-9890-f2015a6ba011/1024.jpeg)
Ашкөз, жалқау және шектен тыс сараң кванторлардың айырмашылығы
Ашкөз, құлықсыз және иеленуші шамалардың арасында шамалы айырмашылықтар бар. Ашкөз кванторлар осылай аталды, себебі олар мүмкін болатын ең ұзын сәйкестікті табуға тырысады: бағдарлама алдымен бүкіл жолды «жеуге» тырысады, егер сәйкестік табылмаса, онда бір таңба алынып тасталады және сәйкестік табылғанша іздеу қайталанады немесе басқа кейіпкерлер қалмайды. Ал, жалқаулар жолдың басынан бастап, өзіне сәйкес келетінін тапқанша таңбадан кейін кейіпкерді қосады. Соңында, қызғаныш сандық сараңдықтағыдай таңбаларды алып тастамай, бүкіл жолды бір рет сканерлейді. Демонстрация үшін біз xfooxxxxxxfoo жолын қолданамыз.![Основы регулярных выражений в Java. Часть 3 - 14](https://cdn.javarush.com/images/article/dab5f212-bec3-4246-bee7-d969dcb04894/1024.jpeg)
GO TO FULL VERSION