JavaRush /Java блогу /Random-KY /Java тилиндеги регулярдуу туюнтмалардын негиздери. 3-бөлү...
articles
Деңгээл

Java тилиндеги регулярдуу туюнтмалардын негиздери. 3-бөлүк

Группада жарыяланган
Туруктуу сөз айкаштарын изилдөөнү уланталы. Бул макалада биз алдын ала белгиленген белги класстарын, ошондой эле сандык аныктоону (ырааттуулуктарды издөө) карайбыз. Java тorндеги регулярдуу туюнтмалардын негиздери.  3-1-бөлүк

Алдын ала аныкталган каарман класстары

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

Кванторлор

Java тorндеги регулярдуу туюнтмалардын негиздери.  3-4-бөлүкКвантификаторлор сапта символдун кайталануу санын көрсөтүүгө мүмкүндүк берет. Келгиле, ач көз, жалкоо жана өтө ач көздүк сандагычтардын кандайча иштээрин тереңирээк карап көрөлү. Бир караганда, X?, X?? жана X?+ бирдей иштейт: “X бир жолу бар же такыр жок.” Бул сандык көрсөткүчтөрдү ишке ашырууда бир аз айырмачылыктар бар, аларды биз төмөндө карайбыз.

Нөл узундугу дал келет

Ач көздүктөн баштайлы. Келгиле, үч түрдүү туруктуу сөз айкаштарын жазалы: “а” тамгасы ?, * же + өзгөчө белгилери менен. Келгиле, бул туруктуу сөз айкаштарын бош сапта сынап көрсөк эмне болорун карап көрөлү: Java тorндеги регулярдуу туюнтмалардын негиздери.  3-5-бөлүкЖогорудагы мисалда издөө алгачкы эки учурда ийгorктүү болду, анткени а? жана а* сапта а символунун жок болушуна жол берет. Ошондой эле башталышы жана акыркы дал келүү индекси бирдей экенин эске алыңыз (0). Киргизүү сапынын узундугу жок болгондуктан, программа биринчи абалда эч нерсе таба алbyte :). Бул учур нөл узундуктагы дал келүү деп аталат. Мындай дал келүүлөр бир нече учурларда пайда болот: киргизүү сабы бош болгондо, киргизүү сызыгынын башында, саптын акыркы символунан кийин же саптын символдорунун ортосунда. Нөл узундуктагы дал келүүлөрдү оңой табууга болот: алар бир позицияда башталып, бүтөт. Келгиле, нөл узундуктагы дал келүүлөрдүн дагы бир нече мисалдарын карап көрөлү. Келгиле, дагы бир нече мисалдар менен нөл узундуктагы дал келүүлөрдү изилдеп көрөлү. Киргизилген сапты "а" символуна өзгөртүп, кызыктуу эффектти байкап көрөлү: Java тorндеги регулярдуу туюнтмалардын негиздери.  3-6-бөлүкүч кванттоочу тең "а" символун табышты, бирок символдун жоктугуна жол берген биринчи экөө 1-позицияда нөл узундуктагы дал келүүнү тапты. - саптын акыркы символунан кийин. Бул программа "a" символун сап катары карап, дал келгендер калмайынча ал аркылуу "чуркап" жаткандыктан болот. Колдонулган квантафикаторго жараша программа саптын аягында "эч нерсе" табат же таппайт. Эми киргизүү сапты беш тамгадан турган "a" ырааттуулугуна өзгөртөлү: Java тorндеги регулярдуу туюнтмалардын негиздери.  3-7-бөлүкКадимки a? саптагы ар бир тамга үчүн өзүнчө дал табат. a* туюнтмасы эки дал келүүнү табат: "a"' символдор ырааттуулугу жана 5-позициядагы нөл узундуктагы дал келүү. Акырында, а+ туруктуу сөз айкашы “эч нерсе” таппай туруп, “а” символдорунун ырааттуулугун гана табат :) Эгерде киргизүү катары ар кандай символдорду камтыган сап берилсе эмне болот? Мисалы, "ababaaaab": Java тorндеги регулярдуу туюнтмалардын негиздери.  3-8-бөлүк"b" белгиси 1, 3 жана 8 позицияларында жана программа бул позицияларда нөл узундуктагы дал келүүлөрдү табат. Регулярдуу туюнтма a? «бга» көңүл бурbyte, жөн гана «а» белгисинин бар-жоктугун издейт. Эгерде кванттоочу "a" нын жок болушуна жол берсе, "a" дан башка саптагы бардык символдор нөл узундуктагы дал келүү катары көрсөтүлөт. Берилген узундуктагы тизмектерди табуу үчүн, жөн гана тармал кашаанын ичинде узундукту көрсөтүңүз: Java тorндеги регулярдуу туюнтмалардын негиздери.  3-9-бөлүкa{3} кадимки туюнтмасы үч "а" символдон турган ырааттуулукту издейт. Биринчи сапта эч нерсе табылган жок, анткени сапта а жетишсиз. Экинчиси программа таба турган 3 белгиден турат. Үчүнчү сыноо да саптын башында дал келет. 3-белгиден кийинки бардык нерсе регулярдуу туюнтманы канааттандырbyte, төмөндөгү codeдо аны аткарат жана бир нече дал келүүлөрү болот: Java тorндеги регулярдуу туюнтмалардын негиздери.  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 тorндеги регулярдуу туюнтмалардын негиздери.  3-11-бөлүкБул мисалда биринчи дал келүү алтынчы белги менен аяктады. Экинчи матч алтынчыдан кийинки белгилерди камтыйт, анткени алар минималдуу узундугу талабын канааттандырат. Эгерде сап бир символго кыскараак болсо, экинчи дал келүү болбойт.

Белги топторун жана класстарды сандык көрсөткүчтөр менен колдонуу

Ушул учурга чейин биз бир эле символду камтыган саптардагы кванторлорду сынап көрдүк. Кванторлор бир гана символго колдонулат, андыктан "abc+" кадимки сөз айкашы "ab" жана "c" камтыган саптарга бир же бир нече жолу дал келет. Бул бир же бир нече жолу "abc" дегенди билдирбейт. Бирок кванторлорду топтор жана белги класстары менен бирге колдонсо болот, мисалы, [abc]+ (a же b же в, бир же бир нече жолу) же (abc)+ (“abc” бир же бир нече жолу). Келгиле, бир сапта үч жолу каармандардын тобун (ит) табалы: Java тorндеги регулярдуу туюнтмалардын негиздери.  3-12-бөлүкБиринчи мисалда программа дал келет, анткени кванттоочу белгилердин тобуна жайылат. Эгер кашааларды алып салсаңыз, {3} квантор "g" тамгасына гана колдонулат. Сиз ошондой эле символ класстары бар кванторлорду колдонсоңуз болот: Основы регулярных выражений в Java. Часть 3 - 13{3} квантор биринчи мисалдагы кашаадагы символдор классына, ал эми экинчисинде - "c" символуна гана колдонулат.

Ачкөз, жалкоо жана ашкере ач көз сандык көрсөткүчтөрдүн ортосундагы айырмачылыктар

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