JavaRush /Java блогу /Random-KY /Java тилиндеги кадимки туюнтмалар, 2-бөлүк

Java тилиндеги кадимки туюнтмалар, 2-бөлүк

Группада жарыяланган
Биз сиздердин назарыңыздарга javaworld веб-сайты үчүн Джефф Фризен тарабынан жазылган Java тorндеги туруктуу сөз айкаштары боюнча кыска жолдун котормосун сунуштайбыз . Окууга ыңгайлуу болушу үчүн биз макаланы бир нече бөлүккө бөлдүк. Java тorндеги кадимки туюнтмалар, 2 - 1-бөлүкJava тorндеги кадимки туюнтмалар, 1-бөлүк
Бир нече диапазонду бириктирүү
Сиз бир нече диапазонду жанаша жайгаштыруу менен бир диапазондун белги классына бириктире аласыз. Мисалы, класс [a-zA-Z]латын алфавитинин кичине же чоң регистрдеги бардык символдоруна дал келет.

Бир нече диапазонду бириктирүү

Сиз бир нече диапазонду жанаша жайгаштыруу менен бир диапазондун белги классына бириктире аласыз. Мисалы, класс [a-zA-Z]латын алфавитинин кичине же чоң регистрдеги бардык символдоруна дал келет.

Каармандар класстарын айкалыштыруу

Символ классынын бирикмеси бир нече уя салынган тамга класстарынан турат жана натыйжада биримдиктин бардык символдоруна дал келет. Мисалы, класс [a-d[m-p]]символдордон aчейин dжана mчейин p. Төмөнкү мисалды карап көрөлү: Бул мисалда дал келген , , жана , java RegexDemo [ab[c-e]] abcdef символдору табылат :abcdeabcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4

Символ классынын кесorши

Символ класстарынын кесorши бардык уя салынган класстар үчүн жалпы символдордон турат жана жалпы символдорго гана дал келет. Мисалы, класс белгилерге [a-z&&[d-f]]дал келет dжана e. fТөмөнкү мисалды карап көрөлү: java RegexDemo "[aeiouy&&[y]]" party Менин Windows операциялык тутумумда кош тырмакчалар талап кылынат, анткени буйрук кабыгы аларды &буйрук бөлгүч катары карайт. yБул мисалда дал келген белгини гана табат party:
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

Белги класстарын алып салуу

Кемитүү символдор класстарында камтылгандардан башка бардык символдордон турат жана ошол калган символдорго гана дал келет. Мисалы, класс дан жана чейин [a-z&&[^m-p]]символдорго дал келет : Бул мисалда дал келген белгилерди табат : alqzjava RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefgdfabcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5

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

Кээ бир тамга класстары стенографиялык белгилерди колдонууну негиздөө үчүн туруктуу сөз айкаштарында жетиштүү көп кездешет . Класс Patternмындай кыскартуулар катары алдын ала аныкталган тамга класстарын сунуштайт. Аларды кадимки туюнтмаларыңызды жөнөкөйлөтүү жана синтаксистик каталарды азайтуу үчүн колдоно аласыз. Алдын ала аныкталган белги класстарынын бир нече категориялары бар: стандарттык, POSIX java.lang.Characterжана скрипт, блок, категория жана бинардык сыяктуу Юниcode касиеттери. Төмөнкү тизме стандарттык класстардын категориясын гана көрсөтөт:
  • \d: Сан. Эквиваленттүү [0-9].
  • \D: Сандык эмес белги. Эквиваленттүү [^0-9].
  • \s: Боштук белгиси. Эквиваленттүү [ \t\n\x0B\f\r].
  • \S: Боштук белгиси эмес. Эквиваленттүү [^\s].
  • \w: Сөз жасоочу белги. Эквиваленттүү [a-zA-Z_0-9].
  • \W: Сөз түзүүчү символ эмес. Эквиваленттүү [^\w].
Төмөнкү мисалда \wкиргизилген тексттеги бардык сөз символдорун сүрөттөө үчүн алдын ала аныкталган символдор классы колдонулат: java RegexDemo \w "aZ.8 _" Төмөнкү аткаруу натыйжаларына кылдаттык менен караңыз, алар чекит жана боштук символдору сөз символдору катары каралбасын көрсөтөт:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Сап бөлгүчтөр
Класстын SDK documentтери Patternчекиттик метасимволду сызык бөлгүчтөрдөн башка бардык символдорго дал келген алдын ала аныкталган символдор классы катары сүрөттөйт (саптын соңун белгилеген бир же эки символдук ырааттуулуктар). Чектөөлөр сызык бөлгүчтөрүнө да дал келген чекиттер режими (мындан ары талкуулайбыз) өзгөчөлүк болуп саналат. Класс Patternтөмөнкү сызык бөлгүчтөрдү айырмалайт:
  • каретка кайтаруу белгиси ( \r);
  • жаңы сап белгиси (кагазды бир сап алдыга жылдыруу белгиси) ( \n);
  • каретанын кайтаруучу символу, андан кийин жаңы сап белгиси ( \r\n);
  • кийинки сап белгиси ( \u0085);
  • сызык бөлүүчү символ ( \u2028);
  • абзац бөлүүчү символ ( \u2029)

Капталган топтор

Тартуу тобу үлгү боюнча издөөдө андан ары колдонуу үчүн табылган символдордун топтомун сактоо үчүн колдонулат. Бул конструкция метабелгилердин ичине кашаа ( ) менен алынган символдордун ырааттуулугу ( ). Үлгү боюнча издөөдө тартылган топтун ичиндеги бардык символдор бир бүтүн катары каралат. Мисалы, тартуу тобу ( ) , жана Javaтамгаларын бирдиктүү бирдикке бириктирет. Бул тартуу тобу киргизүү текстиндеги үлгүнүн бардык көрүнүштөрүн табат . Ар бир дал келген сайын, мурунку сакталган символдор кийинкилерге алмаштырылат. Басып алынган топтор башка кармалган топтордун ичине жайгаштырылышы мүмкүн. Мисалы, туруктуу сөз айкашында, топ топтун ичине жайгаштырылат . Ар бир уя салынган же уя салынбаган тартуу тобуна 1ден баштап сан ыйгарылган жана номерлөө солдон оңго өтөт. Мурунку мисалда дал келүүлөр 1-топтун номерине жана 2-тобуна дал келет . Кадимки сөз айкашында дал келүүлөр 1-топтун номерине жана 2-топтун номерине дал келет . Тартуу топтору тарабынан сакталган дал келүүлөргө кийинчерээк арткы шилтемелер аркылуу кирүүгө болот. Арткы сызык белгиси, андан кийин тартылып жаткан топтун санына туура келген сандык белги катары көрсөтүлгөн артка шилтеме топ тарабынан тартылган тексттеги символдорго кайрылууга мүмкүндүк берет. Артка шилтемеге ээ болуу дал келүүчүгө алынган топтун сакталган издөө натыйжасына андагы сандын негизинде кайрылуусуна алып келет, андан кийин андан ары издөө аракети үчүн ошол натыйжадагы символдорду колдонот. Төмөнкү мисал тексттеги грамматикалык каталарды табуу үчүн артка шилтемени колдонууну көрсөтөт: Бул мисал киргизилген текстте дароо артынан кайталанган сөз менен грамматикалык катаны табуу үчүн туруктуу сөз айкашын колдонот . Бул регулярдуу туюнтма тартуу үчүн эки топту аныктайт: 1 саны – , тиешелүү жана 2 саны – , андан кийин боштук белгисине туура келет . Артка шилтеме №2 топтун сакталган натыйжасын кайра карап чыгууга мүмкүндүк берет, ошондуктан дал келүүчү мейкиндиктин экинчи кайталанышын , андан кийин боштуктун биринчи жолу пайда болгондон кийин жана дароо издей алат . Беттештин жыйынтыгы төмөнкүдөй: JavaJavaJava(Java( language))(language)(Java)(Java( language))(language)(a)(b)(a)(b)Java тorндеги кадимки туюнтмалар, 2-2-бөлүкjava RegexDemo "(Java( language)\2)" "The Java language language"(Java( language)\2)languageJava"The Java language language"(Java( language)\2)Java language language(language)language\2languagelanguageRegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

Чек арачылар

Кээде сызыктын башында, сөздүн чегинде, тексттин аягында ж.б. үлгү дал келүүсүн аткаруу керек болот. PatternМуну төмөнкү жерлерден дал келүүчүлөрдү издеген кадимки туюнтма түзүмдөрү болгон класстын четине дал келүүчүлөрдүн бирин колдонуу менен кыла аласыз :
  • ^: Саптын башталышы;
  • $: Саптын аягы;
  • \b: Сөздүн чеги;
  • \B: Pseudoword boundary;
  • \A: Тексттин башталышы;
  • \G: Мурунку матчтын аягы;
  • \Z: Тексттин аягы, арткы сызык бөлгүчтү кошпогондо (эгерде бар болсо);
  • \z: Тексттин аягы
Төмөнкү мисалда нөл же андан көп сөз символдору ^менен башталган сызыктарды табуу үчүн чекти далдаштыруучу метабелги колдонулат: Символ киргизилген тексттин биринчи үч символу ырааттуу үлгү символдоруна дал келиши керек экенин белгилейт , жана андан кийин каалаган сан болушу мүмкүн. сөз жасоочу символдордун. Бул жерде аткаруунун натыйжасы болуп саналат: Thejava RegexDemo "^The\w*" Therefore^The
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Эгер сиз буйрук сабын өзгөртсөңүз эмне болот java RegexDemo "^The\w*" " Therefore"? ThereforeКиргизилген тексттин алдында боштук белгиси коюлгандыктан, дал келген нерсе табылbyte .

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

Кээде, четтеги дал келүүчүлөр менен иштегенде, сиз нөл узундуктагы дал келүүчүлөргө туш болосуз. Совпадение нулевой длиныэч кандай символду камтыбаган дал келүү болуп саналат. Алар бош киргизилген текстте, кириш тексттин башында, киргизилген тексттин акыркы символунан кийин жана киргизилген тексттин каалаган эки символунун ортосунда болушу мүмкүн. Нөл узундуктагы дал келүүлөрдү таануу оңой, анткени алар ар дайым бир абалда башталып, бүтөт. Төмөнкү мисалды карап көрөлү: java RegExDemo \b\b "Java is" Бул мисал катары эки сөз чектерин издейт жана натыйжалар төмөнкүдөй көрүнөт:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Жыйынтыктарда биз бир нече нөл узундуктагы дал келүүлөрдү көрүп жатабыз. Бул жердеги аяктоочу позициялар баштапкы позициялардан бир азыраак, анткени RegexDemoмен 1-тизмедеги баштапкы codeдо көрсөткөнмүн end() – 1. Java тorндеги кадимки туюнтмалар, 2-3-бөлүк

Кванторлор

Квантёр – бул калыпты сандык маани менен ачык же кыйыр түрдө байланыштырган регулярдуу туюнтма түзүмү. Бул сандык маани үлгүнү канча жолу издөө керектигин аныктайт. Кванторлор ач көз, жалкоо жана өтө ачкөз болуп бөлүнөт:
  • Ач көздүк сан көрсөткүчү ( ?, *же +) эң узун дал келүүнү табуу үчүн иштелип чыккан. Сурасам болобу X? бир же бир нече көрүнүштөрдү табуу X, X*нөл же бир нече көрүнүштөрдү табуу X, X+бир же бир нече көрүнүштөрдү табуу X, окуяларды X{n}табуу , жок дегенде (жана балким андан көп) көрүнүштөрдү табуу жана жок дегенде , бирок андан көп эмес көрүнүштөрдү табуу .nXX{n,}nXX{n,m}nmX
  • Жалкоо кванттоочу ( ??, *?же +?) эң кыска дал келүүнү табуу үчүн иштелип чыккан. Сиз , ? X??_ нөл же андан көп көрүнүштөрдү табуу , бир же бир нече көрүнүштөрдү табуу , окуяларды табуу , жок дегенде (жана балким андан көп) көрүнүштөрдү табуу жана жок дегенде , бирок андан көп эмес көрүнүштөрдү табуу .XX*XX+?XX{n}?nXX{n,}?nXX{n,m}?nmX
  • Өтө ачкөз кванфикатор ( ?+, *+же ++) ач көздүккө окшош, бирок өтө ач көз кванттоочу эң узун дал келгенди табуу үчүн бир гана аракетти жасайт, ал эми ачкөз квантор бир нече аракет жасай алат. X?+Бир же бир нече көрүнүштөрдү табуу үчүн X, X*+нөл же бир нече көрүнүштөрдү табуу X, X++бир же бир нече көрүнүштөрдү табуу X, көрүнүштөрдү X{n}+табуу , жок дегенде (жана балким андан көп) көрүнүштөрдү табуу үчүн жана жок дегенде , бирок андан көп эмес көрүнүштөрдү табуу үчүн коюлушу мүмкүн .nXX{n,}+nXX{n,m}+ nmX
Төмөнкү мисал ачкөз сандык көрсөткүчтүн колдонулушун көрсөтөт: java RegexDemo .*ox "fox box pox" Мына натыйжалар:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Ачкөз квантор ( .*) менен аяктаган символдордун эң узун ырааттуулугун табат ox. Ал толугу менен киргизилген текстти жалмап, андан кийин киргизүү тексти ушул символдор менен аяктаганын аныктамайынча артка жылат. Келгиле, азыр жалкоо кванттоочуну карап көрөлү: java RegexDemo .*?ox "fox box pox" Анын натыйжалары:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Жалкоо кванттоочу ( .*?) менен аяктаган символдордун эң кыска ырааттуулугун табат ox. Ал бош саптан башталат жана дал келгенге чейин бара-бара белгилерди жалмап кетет. Андан кийин киргизүү тексти түгөнгөнгө чейин иштей берет. Акыр-аягы, келгиле, өтө ач көз сандык көрсөткүчтү карап көрөлү: java RegexDemo .*+ox "fox box pox" Жана анын натыйжалары:
regex = .*+ox
input = fox box pox
Кошумча ач көз кванттоочу ( .*+) дал келүүлөрдү таппайт, анткени ал бардык киргизилген текстти жейт жана oxкадимки туюнтумдун аягында дал келе турган эч нерсе калbyte. Ач көз сандагычтан айырмаланып, өтө ач көз сан көрсөткүч артка жылbyte.

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

Кээде кванттоочулар менен иштөөдө сиз нөл узундуктагы дал келүүчүлөргө туш болосуз. Мисалы, төмөнкү ач көз сандык көрсөткүчтү колдонуу бир нече нөл узундуктагы дал келүүгө алып келет: java RegexDemo a? abaa Бул мисалды иштетүүнүн натыйжалары:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Аткаруу жыйынтыгында беш матч бар. Биринчи, үчүнчү жана төртүнчүсү күтүлсө да (алар үч тамганын позицияларына туура келет a) abaa, экинчи жана бешинчи сизди таң калтырышы мүмкүн. Алар тексттин аягына эмне aтуура келерин көрсөтүп жаткандай сезилет , бирок чындыгында андай эмес. bТуруктуу сөз айкашы тексттин аягында a?издебейт . bАл бар же жокту издейт a. таппаса , аны нөл узундуктагы дал келүү катары кабарлайт a?.a

Уюшкан желекчелер

Дал келүүчүлөр кадимки туюнтманы үлгүгө компиляциялоодо жокко чыгарыла турган кээ бир демейки божомолдорду жасашат. Бул маселени кийинчерээк талкуулайбыз. Регулярдуу туюнтма уя салынган желек туюнтмасы аркылуу демейкилердин каалаганын жокко чыгарууга мүмкүндүк берет. Бул регулярдуу туюнтма конструкциясы суроо белгисинин метабелгисинин ( ?) айланасындагы кашаалардын мета символу катары көрсөтүлөт, андан кийин латын тамгасы кичирейт. Класс Patternтөмөнкү уя салынган желекчелерди түшүнөт:
  • (?i): Регистрге сезимсиз үлгү дал келүүнү иштетет. Мисалы, буйрукту колдонууда java RegexDemo (?i)tree Treehouseсимволдордун ырааттуулугу Treeүлгүгө дал келет tree. Демейки - чоң тамгаларды эске алуу менен издөө.
  • (?x): Үлгү ичиндеги метабелгиден башталган боштук белгилерди жана комментарийлерди колдонууга уруксат берет #. Дал келүүчү экөөнү тең четке кагат. Мисалы, java RegexDemo ".at(?x)#match hat, cat, and so on" matterбелгилердин ырааттуулугу үчүн matүлгү дал келет .at. Демейки боюнча, боштук символдоруна жана комментарийлерине уруксат берилбейт жана дал келүүчү аларды издөөгө катышкан символдор катары карайт.
  • (?s): Чекиттик режимди иштетет, мында чекит метабелгиси башка символдордон тышкары сызык бөлүүчүлөргө дал келет. Мисалы, буйрук java RegexDemo (?s). \nжаңы сап белгисин табат. Демейки dotallга карама-каршы келет: эч кандай сызык бөлгүч табылbyte. Мисалы, буйрук Java RegexDemo . \nжаңы сап белгисин таппайт.
  • (?m): Көп сап режимин иштетет, мында ал ар бир саптын ^башына жана $аягына дал келет. Мисалы, java RegexDemo "(?m)^abc$" abc\nabcкиргизүү текстинен эки катарды тең табат abc. Демейки боюнча, бир сап режими колдонулат: ^бүт киргизүү текстинин башына дал келет жана $анын аягына дал келет. Мисалы, java RegexDemo "^abc$" abc\nabcэч кандай дал келүү жок деген жоопту кайтарат.
  • (?u): Юниcodeду сезгич регистрге тегиздөөнү иштетет. Бул желек менен бирдикте колдонулганда (?i)Юниcode стандартына ылайык регистрди сезбеген үлгү дал келүүгө мүмкүндүк берет. Демейки жөндөө регистрге сезимтал жана US-ASCII символдорун гана издөө болуп саналат.
  • (?d): Unix стorндеги сап режимин иштетет, мында дал келүүчү контексттеги мета символдорду .жана сызык бөлгүчтү гана ^тааныйт . Демейки Unix стorндеги сап режими: дал келүүчү жогорудагы метабелгилердин контекстинде бардык сызык бөлгүчтөрүн тааныйт.$\n
Уюшкан желекчелер тартылган топторго окшош, анткени алардын символдору кашаа мета символдору менен курчалган. Тартылган топтордон айырмаланып, уя салынган желек туюнтмалары тексттин символдорун кармабаган регулярдуу туюнтма конструкциясы болуп саналбаган топтордун мисалы болуп саналат. Алар кашаанын метабелгилери менен курчалган символдордун ырааттуулугу катары аныкталат.
Бир нече ички желек туюнтмаларын көрсөтүү
Регулярдуу туюнтмадагы бир нече уя салынган желек туюнтмаларын аларды жанаша ( (?m)(?i))) коюу же аларды аныктаган тамгаларды ырааттуу ( (?mi)) коюу менен көрсөтүүгө болот.

Корутунду

Сиз азыр түшүнгөнүңүздөй, туруктуу сөз айкаштары өтө пайдалуу жана алардын синтаксисинин нюанстарын өздөштүргөн сайын ого бетер пайдалуу болуп калат. Буга чейин мен сени туруктуу сөз айкаштарынын негиздери жана Pattern. Pattern2-бөлүктө биз Regex APIди тереңирээк карап чыгабыз жана , Matcherжана ыкмаларын изилдейбиз PatternSyntaxException. Мен сизге Regex API эки практикалык тиркемесин көрсөтөм, аларды сиз дароо программаларыңызда колдоно аласыз. Java тorндеги кадимки туюнтмалар, 3-бөлүк Java тorндеги кадимки туюнтмалар, 4-бөлүк Java тorндеги кадимки туюнтмалар, 5-бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION