JavaRush /Java блогы /Random-KK /Java тіліндегі тұрақты өрнектердің негіздері. 3-бөлім
articles
Деңгей

Java тіліндегі тұрақты өрнектердің негіздері. 3-бөлім

Топта жарияланған
Тұрақты тіркестер туралы оқуымызды жалғастырайық. Бұл мақалада біз алдын ала анықталған таңбалар кластарын, сондай-ақ сандық бағалауды (тізбектерді іздеу) қарастырамыз. Java тіліндегі тұрақты өрнектердің негіздері.  3 - 1 бөлім

Алдын ала анықталған таңбалар кластары

API сыныбында Patternжиі қолданылатын тұрақты өрнектерге ыңғайлы таңбашалар ұсынатын алдын ала анықталған таңба сыныптары бар. Java тіліндегі тұрақты өрнектердің негіздері.  3 - 2 бөлімБұл кестеде сол жақ бағандағы конструкциялар оң жақ бағандағы өрнектердің стенографиялық көрінісі болып табылады. Мысалы, \dсанды білдіреді (0-9), \wкез келген бас немесе кіші әріпті, астын сызуды немесе санды білдіреді. Мүмкіндігінше алдын ала анықталған таңба сыныптарын пайдаланыңыз. Бұл codeты оқуды және қателерді түзетуді жеңілдетеді. Кері қиғаш сызықтан басталатын конструкциялар қашып шыққан немесе қорғалған деп аталады. \QАлдыңғы мақалаларда біз кері қиғаш сызықтары немесе таңбалары бар арнайы таңбалардан құтылу және \Eоларды кәдімгі таңбалар ретінде пайдалану туралы айтқан болатынбыз . Тұрақты таңбалармен (литералдар) кері қиғаш сызықты пайдалансаңыз, өрнек құрастыру үшін кері қиғаш сызықтан құтылу керек.
private final String REGEX = "\\d"; // цифра
Бұл мысалда \dтұрақты өрнек; қосымша кері қиғаш сызық бағдарламаны құрастыру үшін қажет. Біздің сынақ бағдарламамыз тұрақты өрнектерді тікелей консольден оқиды, сондықтан қосымша қиғаш сызық қажет емес. Келесі мысал алдын ала анықталған таңба сыныптарын пайдалануды көрсетеді: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 3 бөлімJava тіліндегі тұрақты өрнектердің негіздері.  3 - 4 бөлімАлғашқы үш мысалда тұрақты өрнек жай ғана " ." (нүкте арнайы таңба), ол кез келген таңбаны білдіреді. Сондықтан іздеу барлық жағдайда сәтті болды. Басқа мысалдарда біз жоғарыдағы кестеде мәндерін талқылаған алдын ала анықталған таңба сыныптары қолданылады.

Кванторлар

Java тіліндегі тұрақты өрнектердің негіздері.  3 - 4 бөлімКванторлар жолдағы символдың қайталану санын анықтауға мүмкіндік береді. Ашкөз, жалқау және өте ашкөз кванторлардың қалай жұмыс істейтінін егжей-тегжейлі қарастырайық. Бір қарағанда X?, X?? кванторлары болып көрінуі мүмкін. және X?+ бірдей жұмыс істейді: «X бір рет бар немесе мүлде жоқ». Бұл кванторларды жүзеге асыруда шамалы айырмашылықтар бар, біз оларды төменде қарастырамыз.

Нөлдік ұзындық сәйкес келеді

Ашкөзден бастайық. Үш түрлі тұрақты тіркесті жазайық: арнайы таңбалары бар «а» әрпі ?, * немесе +. Осы тұрақты тіркестерді бос жолда сынасақ не болатынын көрейік: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 5 бөлімЖоғарыдағы мысалда іздеу алғашқы екі жағдайда сәтті болды, себебі a? және a* жолда а таңбасының болмауына мүмкіндік береді. Сондай-ақ, бастапқы және соңғы сәйкестік индексі бірдей (0) екенін ескеріңіз. Енгізу жолының ұзындығы болмағандықтан, бағдарлама бірінші орында ештеңе таба алмайды :). Бұл жағдай нөлдік ұзындық сәйкестігі деп аталады. Мұндай сәйкестіктер бірнеше жағдайда болады: енгізу жолы бос болғанда, енгізу жолының басында, жолдың соңғы символынан кейін немесе жолдағы таңбалар арасында. Ұзындығы нөлдік сәйкестіктерді анықтау оңай: олар бір позицияда басталып, аяқталады. Нөлдік ұзындықтағы сәйкестіктердің тағы бірнеше мысалдарын қарастырайық. Нөлдік сәйкестіктерді тағы бірнеше мысалдармен зерттейік. Енгізу жолын «a» таңбасына өзгертіп, қызықты әсерді байқап көрейік: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 6 бөлімБарлық үш кванторлар «a» таңбасын тапты, бірақ символдың болмауына мүмкіндік беретін алғашқы екеуі 1-позицияда нөлдік ұзындық сәйкестігін тапты. - жолдың соңғы символынан кейін. Бұл бағдарлама «a» таңбасын жол ретінде қарастырып, сәйкестіктер қалмайынша ол арқылы «жүгіреді» болғандықтан болады. Қолданылатын кванфикаторға байланысты бағдарлама жолдың соңында «ештеңе» табады немесе таппайды. Енді енгізу жолын бес әріптен тұратын «a» тізбегіне өзгертейік: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 7 бөлімТұрақты a өрнегі? жолдағы әр әріптің сәйкестігін бөлек табады. a* өрнегі екі сәйкестікті табады: "a"' таңбалар тізбегі және 5-позициядағы нөлдік ұзындық сәйкестік. Соңында, a+ тұрақты өрнек «ештеңе» таппай, тек «a» таңбалар тізбегін табады :) Егер кіріс ретінде әртүрлі таңбалардан тұратын жол берілсе не болады? Мысалы, "ababaaaab": Java тіліндегі тұрақты өрнектердің негіздері.  3 - 8 бөлім"b" таңбасы 1, 3 және 8 позицияларында және бағдарлама осы позицияларда нөлдік ұзындық сәйкестіктерін табады. Тұрақты өрнек a? «б»-ға мән бермейді, тек «а» таңбасының бар (немесе жоқтығын) іздейді. Егер квантор "a" болмауына мүмкіндік берсе, жолдағы "a"-дан басқа барлық таңбалар ұзындығы нөлдік сәйкестік ретінде көрсетіледі. Берілген ұзындықтағы тізбектерді табу үшін жай ғана ұзындықты бұйра жақшаларда көрсетіңіз: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 9 бөлімa{3} тұрақты өрнегі үш "a" таңбасының тізбегін іздейді. Бірінші жолда ештеңе табылмады, себебі жолда а саны жеткіліксіз болды. Екіншісінде бағдарлама табатын 3 таңба бар. Үшінші сынақ жолдың басында сәйкестікті табады. 3-ші таңбадан кейінгі барлығы тұрақты өрнекті қанағаттандырмайды, төмендегі codeта ол сәйкес келеді және бірнеше сәйкестік болады: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 10 бөлімЕң аз реттілік ұзындығын көрсету үшін мынаны пайдаланыңыз:
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 бөлімБұл мысалда бірінші сәйкестік алтыншы таңбада аяқталды. Екінші сәйкестікте алтыншыдан кейінгі таңбалар бар, өйткені олар ең аз ұзындық талаптарын қанағаттандырады. Егер жол бір таңбаға қысқа болса, екінші сәйкестік болмас еді.

Кванторлары бар таңбалар топтары мен кластарын пайдалану

Осы уақытқа дейін біз бірдей таңбадан тұратын жолдардағы кванторларды сынадық. Кванторлар тек бір таңбаға қолданылады, сондықтан «abc+» тұрақты өрнегі «ab» және «c» бар жолдарға бір немесе бірнеше рет сәйкес келеді. Бұл бір немесе бірнеше рет «abc» дегенді білдірмейді. Бірақ кванторларды [abc]+ (a немесе b немесе c, бір немесе бірнеше рет) немесе (abc)+ («abc» бір немесе бірнеше рет) сияқты топтармен және таңба сыныптарымен бірге пайдалануға болады. Бір қатарда үш рет таңбалар тобын (ит) табайық: Java тіліндегі тұрақты өрнектердің негіздері.  3 - 12 бөлімБірінші мысалда бағдарлама сәйкестікті табады, өйткені квантор таңбалар тобына таралады. Жақшаларды алып тастасаңыз, {3} кванторы тек «g» әрпіне қолданылады. Сондай-ақ, таңба кластары бар кванторларды пайдалануға болады: Основы регулярных выражений в Java. Часть 3 - 13{3} кванторы бірінші мысалдағы жақшадағы таңбалар класына, ал екіншісінде тек “c” таңбасына қолданылады.

Ашкөз, жалқау және шектен тыс сараң кванторлардың айырмашылығы

Ашкөз, құлықсыз және иеленуші шамалардың арасында шамалы айырмашылықтар бар. Ашкөз кванторлар осылай аталды, себебі олар мүмкін болатын ең ұзын сәйкестікті табуға тырысады: бағдарлама алдымен бүкіл жолды «жеуге» тырысады, егер сәйкестік табылмаса, онда бір таңба алынып тасталады және сәйкестік табылғанша іздеу қайталанады немесе басқа кейіпкерлер қалмайды. Ал, жалқаулар жолдың басынан бастап, өзіне сәйкес келетінін тапқанша таңбадан кейін кейіпкерді қосады. Соңында, қызғаныш сандық сараңдықтағыдай таңбаларды алып тастамай, бүкіл жолды бір рет сканерлейді. Демонстрация үшін біз xfooxxxxxxfoo жолын қолданамыз. Основы регулярных выражений в Java. Часть 3 - 14Бірінші мысал кез келген таңбаны табу үшін ашкөз .* кванторын пайдаланады, 0 немесе одан көп рет, одан кейін "f" "o" "o" таңбалары. Кантификатор ашкөз болғандықтан, табылған сәйкестікте бүкіл жол бар. Ашкөз кванфикатор жолда барлық сәйкестіктерді таба алмайды, өйткені бірінші қадамда бүкіл жолды сканерлегеннен кейін ол сәйкестікті тауып, жұмысты аяқтайды. Екінші мысал жалқау және жолдың басынан басталады, таңба бойынша таңба қосылады. Бағдарлама «бостықтың» бар-жоғын тексеруден басталады, бірақ содан бері "foo" тізбегі жолдың басында жоқ, іздеу "x" таңбасын қосумен жалғасады, содан кейін 0 және 4 индекстерінің арасында бірінші сәйкестік табылады. Іздеу жолдың соңына дейін жалғасады ал екінші сәйкестік 4 және 13 индекстерінің арасында болады. Үшінші мысал сәйкестіктерді таппайды, себебі квантор қызғаныш. Бұл жағдайда .*+ тұрақты өрнек «foo» үшін ештеңе қалдырмай, бүкіл жолды «жеді». Жолдағы қажетсіз кез келген нәрсені тастау қажет болғанда қызғаныш кванторын пайдаланыңыз, ол баламалы сараң кванторға қарағанда тиімдірек болады. Бар болғаны! Дереккөзге сілтеме: Java тіліндегі тұрақты өрнектердің негіздері. 3-бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION