Тұрақты тіркестер туралы оқуымызды жалғастырайық. Бұл мақалада біз алдын ала анықталған таңбалар кластарын, сондай-ақ сандық бағалауды (тізбектерді іздеу) қарастырамыз.
Алдын ала анықталған таңбалар кластары
API сыныбындаPattern
жиі қолданылатын тұрақты өрнектерге ыңғайлы таңбашалар ұсынатын алдын ала анықталған таңба сыныптары бар. Бұл кестеде сол жақ бағандағы конструкциялар оң жақ бағандағы өрнектердің стенографиялық көрінісі болып табылады. Мысалы, \d
санды білдіреді (0-9), \w
кез келген бас немесе кіші әріпті, астын сызуды немесе санды білдіреді. Мүмкіндігінше алдын ала анықталған таңба сыныптарын пайдаланыңыз. Бұл codeты оқуды және қателерді түзетуді жеңілдетеді. Кері қиғаш сызықтан басталатын конструкциялар қашып шыққан немесе қорғалған деп аталады. \Q
Алдыңғы мақалаларда біз кері қиғаш сызықтары немесе таңбалары бар арнайы таңбалардан құтылу және \E
оларды кәдімгі таңбалар ретінде пайдалану туралы айтқан болатынбыз . Тұрақты таңбалармен (литералдар) кері қиғаш сызықты пайдалансаңыз, өрнек құрастыру үшін кері қиғаш сызықтан құтылу керек.
private final String REGEX = "\\d"; // цифра
Бұл мысалда \d
тұрақты өрнек; қосымша кері қиғаш сызық бағдарламаны құрастыру үшін қажет. Біздің сынақ бағдарламамыз тұрақты өрнектерді тікелей консольден оқиды, сондықтан қосымша қиғаш сызық қажет емес. Келесі мысал алдын ала анықталған таңба сыныптарын пайдалануды көрсетеді: Алғашқы үш мысалда тұрақты өрнек жай ғана " .
" (нүкте арнайы таңба), ол кез келген таңбаны білдіреді. Сондықтан іздеу барлық жағдайда сәтті болды. Басқа мысалдарда біз жоғарыдағы кестеде мәндерін талқылаған алдын ала анықталған таңба сыныптары қолданылады.
Кванторлар
Кванторлар жолдағы символдың қайталану санын анықтауға мүмкіндік береді. Ашкөз, жалқау және өте ашкөз кванторлардың қалай жұмыс істейтінін егжей-тегжейлі қарастырайық. Бір қарағанда 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та ол сәйкес келеді және бірнеше сәйкестік болады: Ең аз реттілік ұзындығын көрсету үшін мынаны пайдаланыңыз: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» таңбаларының ең аз реттілік ұзындығы талабына сай келеді. Соңында, максималды реттілік ұзындығын орнату: Бұл мысалда бірінші сәйкестік алтыншы таңбада аяқталды. Екінші сәйкестікте алтыншыдан кейінгі таңбалар бар, өйткені олар ең аз ұзындық талаптарын қанағаттандырады. Егер жол бір таңбаға қысқа болса, екінші сәйкестік болмас еді.
GO TO FULL VERSION