JavaRush /Java блогу /Random-KY /RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска к...
Artur
Деңгээл
Tallinn

RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам. 2 бөлүк

Группада жарыяланган
RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам. 1-бөлүк оригинал бул жерде Акыркы бөлүктө биз эң жөнөкөй туруктуу сөз айкаштарын өздөштүрдүк жана буга чейин бир нерсени үйрөндүк. Бул бөлүктө биз бир аз татаалыраак конструкцияларды изилдейбиз, бирок мага ишен, бул сезилгендей кыйын болбойт. RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  2-1-бөлүкАндыктан уланталы!

8-кадам: Жылдыз *жана плюс белгиси+

RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  2-2-бөлүкАзырынча биз аздыр-көптүр берилген узундуктагы саптарды гана дал келтире алдык. Бирок акыркы көйгөйлөрдө биз буга чейин көргөн белгилер менен эмне кыла ала турган чекке жакындап калдык. Мисалы, биз 3 белгиден турган Java идентификаторлору менен чектелбестен, каалаган узундуктагы идентификаторлорго ээ боло алабыз деп ойлойлу. Мурунку мисалда иштеген чечим төмөнкү мисалда иштебейт:
үлгү: [a-zA-Z_$]\w\w 
сап:   __e $12 3 3.2 fo Bar r a23 мм ab x
дал келет: ^^^ ^^^ ^^^ ^^^  
( Мисалы ) көңүл буруңуздаридентификатор жарактуу, бирок 3 белгиден узун болгондо, биринчи үч символ гана дал келет. Ал эми идентификатор жарактуу болуп, бирок 3 белгиден азыраак болгондо, regex аны такыр таппайт! Көйгөй кашаага алынган туюнтмалар []так бир символго дал келет, мисалы, тамга класстары \w. Бул жогорудагы регулярдуу туюнтмадагы бардык дал келүүлөр так үч символдон турушу керек дегенди билдирет. Ошентип, ал биз ойлогондой жакшы иштебейт. *Атайын каармандар жана бул жерде жардам бере алат +. Булар ошол туюнтмага бир нече жолу дал келүү үчүн каалаган сөз айкашынын оң жагына кошула турган өзгөрткүчтөр. Kleene Star (же "жылдызча") *мурунку белгини каалаган санда, анын ичинде нөл жолу менен дал келиши керек экенин көрсөтөт. Плюс белгиси +бир же бир нече жолу издөө керек экенин көрсөтүп турат. Ошентип, алдында турган туюнтма +милдеттүү (жок дегенде бир жолу), ал эми мурунку туюнтма *милдеттүү эмес, бирок ал пайда болгондо, ал каалаган санда пайда болушу мүмкүн. Эми, бул бorм менен, биз жогорудагы туруктуу сөз айкашын оңдой алабыз:
үлгү: [a-zA-Z_$]\w* 
сап:   __e $123 3.2 Barr a23mm ab x 
дал келет: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Мисалы ) Эми биз каалаган узундуктагы жарактуу идентификаторлорду дал келтиребиз! Бинго! +Бирок анын ордуна колдонсок эмне болмок *?
үлгү: [a-zA-Z_$]\w+ 
сап:   __e $123 3.2 Барр a23mm ab x үчүн
дал келет: ^^^^^^^^^^^^^^^^^^^^^^^ 
( Мисалы ) Биз акыркы матчты өткөрүп жибердик х. Себеби, ал +кеминде бир символду дал келүүнү талап кылат, бирок []мурунку кашаадагы туюнтма \w+символду "жеп" койгондуктан x, башка символдор жок, ошондуктан дал келүү ишке ашпай калат. Качан колдоно алабыз +? Бизге жок дегенде бир дал келүү керек болгондо, бирок берилген туюнтма канча жолу дал келиши маанилүү эмес. Мисалы, биз ондук чекти камтыган кандайдыр бир сандарды тапкыбыз келсе:
үлгү: \d*\.\d+ 
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
дал келүүдө: ^^^^^ ^^^^^^^^^^^^^^^^^^^^  
( Мисалы ) көңүл буруңуздарондук чекиттин сол жагындагы сандарды кошумча кылуу менен биз 0,011 жана .2 экөөнү тең таба алдык. Бул үчүн, биз так бир ондук чекит менен \.жана ондук чекиттин оң жагындагы жок дегенде бир цифраны менен дал келтиришибиз керек болчу \d+. Жогорудагы кадимки туюнтма сыяктуу санга дал келбейт 3., анткени дал келүү үчүн бизге ондук чекиттин оң жагына жок дегенде бир цифра керек.

Адаттагыдай эле, бир нече жөнөкөй маселелерди чечели:

Төмөнкү үзүндүдөн бардык англисче сөздөрдү табыңыз.
үлгү:
сап: 3 плюс 3 алты, ал эми 4 плюс үч 7 болот
дал келет:    ^^^^ ^^ ^^^ ^^^^^^^^^^^^^^^^^ 
( Чечим ) Төмөнкү тизмеден бардык файл өлчөмү символдорун табыңыз. Файлдын өлчөмдөрү сандан турат (ондук чекит менен же ондук чекитсиз), андан кийин KB, MB, GBже TB:
үлгү:
сап:   11TB 13 14.4MB 22HB 9.9GB TB 0KB 
дал келет: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Чечим )

9-кадам: "милдеттүү эмес" суроо белгиси?

RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  2-3-бөлүкАкыркы маселени чечүү үчүн regex жаздыңызбы? Иштедиби? Эми аны бул жерде колдонуп көрүңүз:
үлгү:
сап: 1..3KB 5...GB ..6TB
дал келет:  
Албетте, бул белгилердин бири да жарактуу файл өлчөмү эмес, андыктан жакшы кадимки туюнтма алардын экөөнө да дал келбеши керек. Акыркы маселени чечүү үчүн мен жазган чечим алардын баарына, жок дегенде жарым-жартылай дал келет:
үлгү: \d+\.*\d*[KMGT]B 
сап:   1..3KB  5...GB .. 6TB 
дал келет: ^^^^^^ ^^^^^^ ^^^ 
( Мисалы ) Анда эмне көйгөй бар? Чынында, биз бир гана ондук чекит бар болсо, табуу керек. Бирок *ал каалаган сандагы дал келүүгө, анын ичинде нөлгө жол берет. Нөл жолу же бир жолу дал келүүнүн жолу барбы? Бирок бир жолудан ашык эмес? Албетте бар. "милдеттүү эмес" ?- бул нөлгө же мурунку символдордун бирине дал келген өзгөртүүчү, бирок андан ашык эмес:
үлгү: \d+\.?\d*[KMGT]B 
сап: 1.. 3KB 5...GB .. 6TB 
дал келет:     ^^^ ^^^ 
( Мисалы ) Бул жерде биз бир чечимге жакыныраакпыз, бирок бул бизге керектүү нерсе эмес. Муну кантип оңдоону бир аздан кийин бир нече кадамдан кийин карап чыгабыз.

Ал ортодо бул маселени чечели:

Кээ бир программалоо тилдеринде (мисалы, Java), кээ бир бүтүн жана калкыма чекиттүү (чекит) сандардан кийин l/ Lжана f/ болушу мүмкүн F, алар кадимки int/double эмес, узун/сүзмө (тиешелүүлүгүнө жараша) катары каралышы керек. Төмөнкү сапта бардык жарактуу "узун" сандарды табыңыз:
үлгү:
сап:   13л узун 2л 19 L lL 0 
дал келүүдө: ^^^ ^^ ^^ ^ 
( Чечим )

10-кадам: "же" белгиси|

RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  2-4-бөлүк8-кадамда калкыма чекиттердин ар кандай түрлөрүн табуу кыйынга турду:
үлгү: \d*\.\d+ 
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
дал келүүдө: ^^^^^ ^^^^^^^^^^^^^^^^^^^^  
Жогорудагы үлгү ондук чекит менен сандарга жана ондук чекиттин оң жагында жок дегенде бир цифрага дал келет. Бирок, эгерде биз ошондой эле саптарды дал келтирүүнү кааласакчы 0.? (Ондук чекиттин оң жагында сандар жок.) Төмөнкүдөй туруктуу туюнтманы жазсак болот:
үлгү: \d*\.\d* 
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. . 
дал келет: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( Мисал ) Бул дал келет , бирок жогоруда көрүп тургандай, 0.бир чекитке да дал келет . .Чынында, биз дал келүүгө аракет кылып жаткан нерсе - бул эки башка сап класстары:
  1. ондук чекиттин оң жагында жок дегенде бир цифрасы бар сандар
  2. ондук чекиттин сол жагында жок дегенде бир цифрасы бар сандар
Төмөнкү 2 туруктуу сөз айкашын бири-биринен көз карандысыз жазалы:
үлгү: \d*\.\d+ 
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
дал келет: ^^^^^ ^ ^^^^^^^^^^^^^^^^^^^^^^^  
үлгү: \d+\.\d* 
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
дал келет: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Биз бул учурлардын эч биринде 42, 5, 6же подсаптары .кыймылдаткыч тарабынан табылбагандыгын көрөбүз. Керектүү натыйжаны алуу үчүн, бул туруктуу сөз айкаштарын бириктирүү бизге зыян келтирбейт. бул кантип жетсек болот? "Же" белгиси |кадимки туюнтмадагы дал келүүлөрдүн бир нече мүмкүн ырааттуулугун көрсөтүүгө мүмкүндүк берет. []"Же" белгиси бизге альтернативалуу жалгыз символдорду көрсөтүүгө мүмкүндүк бергендей эле , |биз альтернативалуу көп тамгалуу туюнтмаларды белгилей алабыз. Мисалы, биз "ит" же "мышыкты" тапкыбыз келсе, төмөнкүдөй нерсени жазсак болот:
үлгү: \w\w\w 
сап:   Албетте , ит мышыкка караганда жакшыраак үй жаныбары .
дал келет: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ 
( Мисалы ) ... бирок бул "сөз" классынын бардык үч тамга ырааттуулугуна дал келет. Бирок "ит" менен "мышык" деген жалпы тамгаларга да ээ эмес, андыктан чарчы кашаа бул жерде бизге жардам бербейт. Бул жерде биз колдоно турган эң жөнөкөй регулярдуу сөз айкашы экөөнө тең жана ушул эки сөзгө гана дал келет:
үлгү: ит|мышык 
сап: Албетте, ит мышыктан жакшыраак үй жаныбары .
дал келет:               ^^^ ^^^ 
( Мисалы ) Регулярдуу туюнтма кыймылдаткычы адегенде символдун сол жагына бүт ырааттуулукту дал келтирүүгө аракет кылат |, бирок ал ийгorксиз болсо, анда ал символдун оң жагындагы ырааттуулукка дал келүүгө аракет кылат |. Бир нече символдорду |экиден ашык альтернативдик ырааттуулукка дал келүү үчүн чынжырлашууга болот:
үлгү: ит|мышык|жаныбар 
сап: Албетте, ит мышыктан жакшыраак үй жаныбары .
дал келет:               ^^^ ^^^ ^^^ 
( Мисалы )

Эми бул кадамды жакшыраак түшүнүү үчүн дагы бир эки маселени чечели:

|Төмөнкүдөй жыйынтык чыгаруу үчүн жогорудагы ондук үзгүлтүксүз туюнтманы оңдоо үчүн белгини колдонуңуз :
үлгү:
сап:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
дал келет: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( Чечим ) Мурунку кадамдын аягындагы маселеде талкуулангандай, бүтүн жана калкыма чекит (чекит) сандарына дал келген бирдиктүү регулярдуу туюнтманы түзүү үчүн белгини |, тамга класстарын, "милдеттүү эмес" ж.б. колдонуңуз (бул маселе бир аз ?татаалыраак, ооба;))
үлгү:
сап:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
дал келет: ^^^ ^^^^^^^^^^^^^^^^^^^^  
( Чечим ) Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам. 3-бөлүк RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам. 4-бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION