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

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

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

11-кадам: ()Топторду тартуу катары кашаалар

Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  3-2-бөлүкАкыркы маселеде биз бүтүн сандардын ар кандай түрлөрүн жана калкыма чекиттүү (чекит) сандык маанилерди издедик. Бирок кадимки туюнтма кыймылдаткычы баалуулуктардын бул эки түрүн айырмалай алган жок, анткени бардыгы бир чоң регулярдуу туюнтмада камтылган. Эгерде мини-үлгүлөрүбүздү кашаага алсак, кадимки туюнтма кыймылдаткычына дал келүүлөрдүн ар кандай түрлөрүн айырмалоо үчүн айта алабыз:
үлгү: ([AZ])|([az]) 
сап:   Боливиянын учурдагы президенти - Эво Моралес .
дал келүүлөр: ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Группа:    122 2222222 122222222 22 1222222 22 122 1222222  
( Мисал ) Жогорудагы регулярдуу туюнтма 1ден баштап индекстелген эки тартуу тобун аныктайт. Биринчи тартуу тобу каалаган бир чоң тамгага, ал эми экинчи тартуу тобу кандайдыр бир кичинекей тамгага дал келет. |"Же" белгисин жана кашааларды басып алуу тобу катары колдонуу менен (), саптардын бир нече түрлөрүнө дал келген бир регулярдуу туюнтманы аныктай алабыз. Эгер биз муну макаланын мурунку бөлүгүндөгү узун/сүзмө издөө регексибизге колдонсок, анда regex кыймылдаткычы тиешелүү топтордогу тиешелүү дал келүүлөрдү басып алат. Субсап кайсы топко дал келерин текшерүү менен, анын калкыма мааниси же узун маани экенин дароо аныктай алабыз:
үлгү: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) сап: 42L 
12   x 3.4f 6l 3.3 0F LF .2F 0.
матчтар: ^^^ ^^^^ ^^ ^^ ^^^ 
топ:    222 1111 22 11 111  
( Мисалы ) Бул туруктуу сөз айкашы абдан татаал жана аны жакшыраак түшүнүү үчүн, келгиле, аны майдалап, ушул калыптардын ар бирин карап көрөлү:
( // каалаган "флоат" подсапка дал келет
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //ЖЕ
( // каалаган "узун" ички сапка дал келет
  \d+[lL]
)
|Кашадагы белги жана тартуу топтору ()ар кандай типтеги саптарды дал келүүгө мүмкүндүк берет. Бул учурда, биз же калкып жүрүүчү чекиттерди "сүзүүчү" же "узун" узун бүтүн сандарды дал келтиребиз.
(
  \d*\.\d+[fF] // Ондук чекиттин оң жагында 1+ цифра
  |
  \d+\.\d*[fF] // ондук чекиттин сол жагында 1+ цифра
  |
  \d+[fF] // чекит жок, болгону 1+ цифра
)
|
(
  \d+[lL] // чекит жок, болгону 1+ цифра
)
"Флоат" тартуу тобунда бизде үч вариант бар: ондук чекиттин оң жагында жок дегенде 1 цифрасы бар сандар, ондук чекиттин сол жагында жок дегенде 1 цифрасы бар сандар жана ондук чекити жок сандар. Алардын кайсынысы болсо да аягына “f” же “F” тамгалары кошулуп турса, “сүзмө” болуп саналат. "Узун" тартуу тобунун ичинде бизде бир гана вариант бар - бизде 1 же андан көп сандан кийин "l" же "L" белгиси болушу керек. Регулярдуу туюнтма кыймылдаткычы берилген сапта бул субсаптарды издеп, аларды тиешелүү тартуу тобунда индекстейт. көңүл буруңуздарБиз "l", "L", "f" же "F" кошулбаган сандардын эч бирине дал келбей жатканыбызды. Бул сандарды кантип классификациялоо керек? Ооба, аларда ондук чекит бар болсо, Java тor демейки "кош" болот. Болбосо, алар "int" болушу керек.

Келгиле, үйрөнгөнүбүздү бир нече табышмак менен бекемдейли:

Жогорудагы регекске дагы эки тартуу тобун кошуңуз, ал кош же int сандарын да классификациялайт. (Бул дагы бир татаал суроо, эгер бир аз убакыт талап кылынса, көңүлүңүздү чөгөрбөңүз, акыркы чара катары менин чечимимди караңыз.)
үлгү:
сап:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
дал келет: ^^^ ^^^^^^ ^^ ^^^ ^^ ^^^ ^^ 
топ:    333 44 1111 33 222 11 111 22
( Чечим ) Кийинки маселе бир аз жөнөкөй. Төмөнкү курактарды иреттөө үчүн кашаага алынган тартуу топторун (), "же" белгисин |жана белги диапазондорун колдонуңуз: "АКШда ичүүгө мыйзамдуу". (>= 21) жана "АКШда ичүүгө болбойт" (<21):
үлгү:
сап:   7 10 17 18 
19    20 21 22 23 24 30 40 100 120 
дал келүүдө: ^ ^^ ^^ ^^ ^^ ^^ 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Чечим )

12-кадам: Адегенде конкреттүү дал келүүлөрдү аныктаңыз

Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  3-3-бөлүкЭгер сиз "мыйзамдуу ичимдиктерди" экинчи эмес, биринчи топ катары аныктоого аракет кылсаңыз, акыркы тапшырманы аткарууда кандайдыр бир кыйынчылыктарга туш болушуңуз мүмкүн. Мунун себебин түшүнүү үчүн дагы бир мисалды карап көрөлү. 4 символдон ашпаган фамorяларды жана 4 же андан көп белгиден турган фамorяларды өзүнчө жазгыбыз келет дейли. Биринчи басып алуу тобуна кыскараак аттарды берип, эмне болорун карап көрөлү:
үлгү: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
сап:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
матчтар: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
топ:    111 111 11 111 111 111 111   
( Мисалы ) Демейки боюнча, көпчүлүк кадимки туюнтма кыймылдаткычтары биз буга чейин көргөн негизги символдорго ач көздүк менен дал келүүнү колдонушат. Бул кадимки туюнтма кыймылдаткычы берилген регулярдуу сөз айкашында мүмкүн болушунча эрте аныкталган эң узун топту басып алат дегенди билдирет. Ошентип, жогорудагы экинчи топ, мисалы, "Джобс" жана "Клойд" сыяктуу ысымдарда көбүрөөк символдорду кармай алганы менен, бирок ал ысымдардын алгачкы үч белгисин биринчи басып алуу тобу басып алгандыктан, экинчи топ аларды кайра тартып ала алbyte. . Эми бир аз оңдоо киргизели - жөн гана өзгөчө (узун) топту биринчи коюп, басып алуу топторунун тартибин өзгөртүңүз:
pattern: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
дал келүүлөр: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
( Мисалы )

Тапшырма... бул жолу бир гана :)

"Көбүрөөк" үлгү дээрлик дайыма "узун" дегенди билдирет. «Сөздөрдүн» эки түрүн тапкыбыз келет дейли: адегенде үндүү тыбыштар менен башталгандар (тактап айтканда), андан кийин үндүүлөр менен башталбагандар (башка сөз). Бул эки топко дал келген саптарды кармоо жана аныктоо үчүн кадимки туюнтманы жазып көрүңүз. (Төмөндөгү топтор номерленген эмес, тамгалар менен жазылган. Кайсы топ биринчиге, кайсынысы экинчиге туура келээрин аныкташыңыз керек.)
үлгү:
string:   pds6f uub 24r2gp ewqrty l ui_op 
дал келет: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^^^^^ 
группа:    NNNNN ВВВ NNNNNN ВВВВВ Н ВВВВВ
( Чечим ) Жалпысынан алганда, сиздин туруктуу сөз айкашыңыз канчалык так болсо, ал ошончолук узакка созулат. Ал канчалык так болсо, сизге кереги жок нерсени тартып алуу ыктымалдыгы ошончолук аз болот. Ошентип, алар коркунучтуу көрүнүшү мүмкүн, бирок узун регекс ~= жакшыраак регекс. Тилекке каршы .

13-кадам: {}Кайталоолордун белгилүү бир саны үчүн тармал кашаа

Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  3-4-бөлүкМурунку кадамдагы фамorялар менен мисалда бизде бир калыпта дээрлик кайталанган 2 топ бар болчу:
pattern: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
дал келүүлөр: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
Биринчи топ үчүн төрт же андан көп тамгадан турган фамorялар керек болчу. Экинчи топ үч же андан аз тамгадан турган фамorяларды алуу керек болчу. [a-z]Бул топторду кайра-кайра кайталоодон көрө муну жазуунун оңой жолу барбы ? Бул үчүн тармал кашааларды колдонсоңуз болот {}. Тармал кашаалар {}мурунку белгинин же тартуу тобунун эң аз жана (милдеттүү эмес) максималдуу дал келүү санын көрсөтүүгө мүмкүндүк берет. Үч колдонуу учуру бар {}:
{X} // так X жолу дал келет
{X,} // дал келет >= X жолу
{X,Y} // >= X жана <= Y жолу дал келет
Мына ушул үч түрдүү синтаксистин мисалдары:
үлгү: [az]{11} 
сап:   хомуһумунук унукуапуа'а.
дал келет: ^^^^^^^^^^^   
( Мисалы )
үлгү: [az]{18,} 
сап:   humuhumunukunukuapua 'a.
дал келет: ^^^^^^^^^^^^^^^^^^^^^^^    
( Мисалы )
үлгү: [az]{11,18} 
сап:   хомухумунукунукуап уаа.
дал келет: ^^^^^^^^^^^^^^^^^^^^    
( Мисалы ) Жогорудагы мисалдарда көңүл бура турган бир нече жагдайлар бар.конул буруу:. Биринчиден, {X} белгисин колдонуп, мурунку белги же топ дал ошол санга (X) жолу келет. Эгерде "сөздө" үлгүгө дал келе турган (биринчи мисалда көрсөтүлгөндөй) көп символдор бар болсо, анда алар дал келүүгө киргизилбейт. Эгерде символдордун саны X санынан аз болсо, анда толук дал келбей калат (биринчи мисалда 11ден 99га чейин өзгөртүп көрүңүз). Экинчиден, {X,} жана {X,Y} белгилер ач көздүк. Алар берилген регулярдуу туюнтманы канааттандыруу менен мүмкүн болушунча көп символдорду дал келтирүүгө аракет кылышат. Эгер сиз {3,7} көрсөтсөңүз, анда 3төн 7ге чейинки белгилерди дал келтирүүгө болот жана кийинки 7 белги жарактуу болсо, анда бардык 7 белги дал келет. Эгер сиз {1,} көрсөтсөңүз жана кийинки 14 000 символдун бардыгы дал келсе, анда ал 14 000 символдун баары тиешелүү сапка кошулат. Жогорудагы сөз айкашыбызды кайра жазуу үчүн бул бorмди кантип колдонсок болот? [a-z]Эң жөнөкөй жакшыртуу кошуна топторду менен алмаштыруу болушу мүмкүн [a-z]{N}, мында N тиешелүү түрдө тандалат:
үлгү: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...бирок бул абалды жакшырта алbyte. Биринчи тартуу тобун караңыз: бизде [a-z]{2}(ал 2 кичине тамгага дал келет), андан кийин [a-z]+(ал 1 же андан көп кичине тамгалар дал келет). Тармал кашааларды колдонуу менен 3 же андан көп кичине тамгаларды сурап, муну жөнөкөйлөштүрө алабыз:
үлгү: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Экинчи басып алуу тобу башкача. Бул фамorяларда үч символдон ашпашы керек, демек бизде жогорку чек бар, бирок төмөнкү чегибиз нөлгө барабар:
үлгү: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Туруктуу сөз айкаштарын колдонууда өзгөчөлүк ар дайым жакшыраак, андыктан бул жерде токтоп калганым туура болот, бирок мен бул эки символдун диапазону ( [AZ]жана [az]) бири-биринин жанындагы "сөздүн символу" классына окшош экенин байкабай коё албайм, \w( [A-Za-z0-9_]) . Эгерде биз маалыматтарыбызда жакшы форматталган фамorялар бар экенине ишенсек, анда биз кадимки сөз айкашыбызды жөнөкөйлөтүп, жөн эле жазсак болот:
үлгү: (\w{4,})|(\w{1,3}) 
Биринчи топ 4 же андан көп "сөз символдорунун" ( [A-Za-z0-9_]) каалаган ырааттуулугун, ал эми экинчи топ 1ден 3кө чейинки "сөз символдорун" (кошкондо) каалаган ырааттуулугун тартат. Бул иштейби?
үлгү: (\w{4,})|(\w{1,3}) 
сап:   Ким Джобс Сю Клойд Мор Нго Рок .
дал келүүлөр: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
( Мисалы ) Бул иштеди! Бул ыкма жөнүндө эмне айтууга болот? Жана бул биздин мурунку мисалга караганда алда канча таза. Биринчи басып алуу тобу төрт же андан көп белгиден турган бардык фамorяларга дал келгендиктен, биз экинчи басып алуу тобун жөн гана деп өзгөртө алабыз \w+, анткени бул бизге калган фамorялардын баарын (1, 2 же 3 белги менен) тартууга мүмкүндүк берет:
үлгү: (\w{4,})|(\w+) 
сап:   Ким Джобс Сю Клойд Мор Нго Рок .
дал келүүлөр: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
( Мисалы )

Келгиле, мээге муну үйрөнүүгө жана төмөнкү 2 маселени чечүүгө жардам берели:

{}7-кадамдагы социалдык камсыздандыруу номерин издөөнүн кадимки туюнтмасын кайра жазуу үчүн тармал кашааларды колдонуңуз :
үлгү:
сап: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
дал келет:              ^^^^^^^^^^^
( Чечим ) Вебсайттын сырсөз күчүн текшергич колдонуучунун сырсөздөрүнүн 6 жана 12 символдун ортосунда болушун талап кылат деп ойлойлу. Төмөнкү тизмеде жараксыз сырсөздөрдү белгилөөчү кадимки туюнтманы жазыңыз . Ар бир сырсөз оңой дал келүү үчүн кашаанын ичинде камтылган , андыктан кадимки туюнтма түз жана символикалык символдор ()менен башталып, бүтөөрүн текшериңиз . Ишара: сырсөздөрдүн ичинде же окшош кашааларга жол бербөөнү текшериңиз, антпесе бүт сапка дал келип каласыз! ()[^()]
үлгү:
сап:   (12345) (менин сырсөзүм) (Xanadu.2112) (su_do) (OfSalesmen!)
дал келет: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^  
( Чечим )

14-кадам: \bнөлдүн туурасы чек ара белгиси

Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  3-5-бөлүкАкыркы тапшырма абдан оор болду. ""Бирок паролдорду кашаанын ордуна тырмакчага алуу менен аны бир аз татаалдаштырсакчы ()? Бардык кашаа белгилерди тырмакча белгилери менен алмаштыруу менен ушундай чечимди жаза алабызбы?
үлгү: \"[^"]{0,5}\"|\"[^"]+\s[^"]*\" 
сап:   "12345" "менин сырсөзүм" "Xanadu.2112 " " su_do" " OfSalesmen! "
дал келет: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Мисалы ) Бул абдан таасирдүү болгон жок. Эмне үчүн деп ойлодуңуз беле? Көйгөй биз бул жерден туура эмес сырсөздөрдү издеп жатабыз. "Xanadu.2112" - бул жакшы сырсөз, андыктан регекс бул ырааттуулукта боштуктарды же литералдык символдорду камтыбаганын түшүнгөндө , ал оң жактагы сырсөздү квалификациялаган "символдун алдында пайда болот . "(Анткени биз сырсөздөрдүн ичинен символдорду "табуу мүмкүн эмес деп белгилегенбиз [^"].) Кадимки туюнтма кыймылдаткычы ал символдор белгилүү бир регулярдуу сөз айкашына дал келбегенине ынангандан кийин, ал токтогон жеринен кайра иштейт ". Xanadu.2112" оң жакта. Ал жерден ал бир мейкиндик каарманын көрөт, экинчиси "- ал үчүн бул туура эмес сырсөз! Негизинен, ал ушул ырааттуулукту таап " ", андан ары уланат. Бул такыр биз алгыбыз келбейт... Сырсөздүн биринчи символу боштук болбошу керектигин тактап алсак абдан жакшы болмок. Муну кылуунун жолу барбы? (Учурда сиз менин бардык риторикалык суроолорума жооп "ооба" экенин түшүнгөн чыгарсыз.) Ооба! Мындай жол бар! Көптөгөн регулярдуу сөз кыймылдаткычтары "сөздүн чеги" сыяктуу качуу ырааттуулугун камсыз кылат \b. "Сөз чеги" \b- бул, таң калыштуусу, сөздүн чегине дал келген нөл кеңдиктеги качуу ырааттуулугу. Эсиңизде болсун, биз "сөз" деп айтканда, класстагы символдордун каалаган ырааттуулугун \wже [A-Za-z0-9_]. Сөздүн чек арасынын дал келүүсү ырааттуулуктун алдындагы же дароо кийинки символ сөз белгиси \bболушу керек дегенди билдирет. неБирок, дал келгенде, биз бул белгини тартылган субсапка киргизбейбиз. Бул нөл туурасы. Мунун кантип иштээрин көрүү үчүн, келгиле, кичинекей бир мисалды карап көрөлү:
үлгү: \b[^ ]+\b 
сап:   Ve still vant ze money , Lebowski .
дал келет: ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Мисал ) Тиздик [^ ]түзмө-түз боштук белгиси болбогон бардык символдорго дал келиши керек. ,Анда эмне үчүн бул акчадан кийинки үтүргө же Лебовскийден кийинки чекитке дал келбейт .? Себеби үтүр ,жана чекит .сөздүн символу эмес, ошондуктан чек аралар сөздүн символдору менен сөз эмес символдордун ортосунда түзүлөт. Алар yчектин аягында пайда болот. акча деген сөз жана ,андан кийинки үтүр . жана " iLebowski сөзү менен .андан кийинки чекит (толук чекит/чейин) ортосунда. Кадимки сөз айкашы бул сөздөрдүн чегине дал келет (бирок аларды аныктоого жардам берген сөз эмес символдорго эмес). \bБирок шаблонубузга ырааттуулукту киргизбесек эмне болот ?
үлгү: [^ ]+ 
сап:   Ve still vant ze money, Lebowski. 
Матчтар: ^^ ^^^^^^ ^^^^^^^^  
( Мисалы ) Ооба, азыр биз бул тыныш белгилерин да табабыз. Эми цитаталанган сырсөздөр үчүн регексти оңдоо үчүн сөз чектерин колдонолу:
үлгү: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\" 
сап:   "12345" "менин сырсөзүм" " Xanadu. 2112" "su_do" "Сатуудан сырткары!"
дал келет: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^  
( Мисал ) Тырмакчанын ичине сөз чектерин коюу менен ("\b ... \b") биз дал келген сырсөздөрдүн биринчи жана акыркы символдору "сөз символдору" болушу керек экенин натыйжалуу айтып жатабыз. Демек, бул жерде жакшы иштейт, бирок колдонуучунун сырсөзүнүн биринчи же акыркы символу сөз белгиси болбосо, ошондой иштебейт:
үлгү: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\"
сап: "төмөнкү сырсөздү аныктоо" "C++"
дал келет:   
( Мисал ) Экинчи сырсөз өтө кыска болгону менен "жараксыз" деп белгиленбегенин караңыз. Сиз болушуңуз керексакырааттуулугу менен \b, анткени алар белгилердин ортосундагы чектерге гана дал келет \wжана эмес \w. Жогорудагы мисалда, биз символдорго уруксат бербегендиктен, сырсөздөрдүн \wортосундагы чек ара \жана сырсөздүн биринчи/акыркы символу сөздүн чеги болушуна кепилдик жок \b.

Бул кадамды аяктоо үчүн биз бир гана жөнөкөй маселени чечебиз:

Сөздүн чек аралары синтаксисти бөлүп чыгаруучу кыймылдаткычтарда биз белгилердин белгилүү ырааттуулугуна дал келүүнү кааласак, бирок алар сөздүн башында же аягында гана (же өз алдынча) болушун кааласак, пайдалуу. Келгиле, биз синтаксисти бөлүп көрсөтүүнү жазып жатабыз дейли жана var сөзүн баса белгилегибиз келет, бирок ал өз алдынча пайда болгондо гана (сөздөгү башка символдорго тийбестен). Бул үчүн туруктуу сөз айкашын жаза аласызбы? Албетте, мүмкүн, бул абдан жөнөкөй иш;)
үлгү:
сап:   var varx _var ( var j) barvarcar * var var -> { var }
дал келет: ^^^ ^^^ ^^^ ^^^ ^^^  
( Чечим )

15-кадам: "каретка" ^"саптын башталышы" жана доллар белгиси $"саптын аягы"

Туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам.  3-6-бөлүкСөздүн чек ырааттуулугу \b(макаланын мурунку бөлүгүнүн акыркы кадамынан) туруктуу сөз айкаштарында колдонууга мүмкүн болгон бирден-бир атайын нөлдүү ырааттуулук эмес. Эң популярдуу эки "карет" ^- "саптын башталышы" жана доллар белгиси $- "саптын аягы". Алардын бирин кадимки туюнтмаларыңызга кошуу дал келүү булак саптын башында же аягында болушу керек дегенди билдирет:
үлгү: ^start|end$ 
сап:   старт аягы башталышы аягы башталышы аягы аягы 
дал келүүлөр: ^^^^^ ^^^  
( Мисал ) Эгерде сиздин сапта сап үзгүлтүктөрү камтылса, ал ^startкаалаган саптын башындагы "баштоо" ырааттуулугуна дал келет жана end$каалаган саптын аягындагы "аягы" ырааттуулугуна дал келет (бирок муну бул жерде көрсөтүү кыйын). Бул белгилер өзгөчө бөлүүчүлөрдү камтыган маалыматтар менен иштөөдө пайдалуу. ^Келгиле, 9-кадамдан баштап "саптын башталышы" аркылуу "файлдын өлчөмү" маселесине кайрылалы . Бул мисалда биздин файлдын өлчөмдөрү боштуктар менен бөлүнгөн " ". Ошентип, биз ар бир файлдын өлчөмүнүн алдына боштук белгиси же саптын башталышы турган сан менен башталышын каалайбыз:
үлгү: (^| )(\d+|\d+\.\d+)[KMGT]B 
сап:   6.6КБ 1..3КБ 12КБ 5G 3.3МБ КБ .6.2ТБ 9МБ .
матчтар: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
топ:    222 122 1222 12    
( Мисалы ) Биз максатка абдан жакынбыз! Бирок сиз бизде дагы эле бир кичинекей көйгөй бар экенин байкасаңыз болот: биз жарактуу файл өлчөмүнө чейин боштук белгисине дал келип жатабыз. Эми бул басып алуу тобун (1) биздин кадимки туюнтма кыймылдаткычыбыз тапканда жөн эле этибарга албай койсок болот же биз кийинки кадамда көрө турган басып албоочу топту колдоно алабыз.

Азырынча тон үчүн дагы 2 маселени чечели:

Акыркы кадамдагы биздин синтаксисти бөлүп көрсөтүү мисалыбызды улантуу менен, кээ бир синтаксисти бөлүп көрсөтүү арттагы боштуктарды, башкача айтканда, боштук эмес белги менен саптын аягында келген боштуктарды белгилейт. Арткы боштуктарды гана бөлүп көрсөтүү үчүн регекс жаза аласызбы?
үлгү:
сап: myvec <- c(1, 2, 3, 4, 5)  
дал келет:                          ^^^^^^^  
( Чечим ) Жөнөкөй үтүр менен бөлүнгөн маани (CSV) талдоочу үтүр менен бөлүнгөн "токендерди" издейт. Жалпысынан алганда, боштук тырмакчага алынмайынча эч кандай мааниге ээ болбойт "". Жөнөкөй CSV талдоочу регулярдуу туюнтманы жазыңыз, ал үтүрлөрдүн ортосундагы токендерге дал келет, бирок тырмакчалардын ортосундагы бош боштукка көңүл бурbyte (жазbyte ) .
үлгү:
сап:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
дал келет: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
топ:    21 2221 2222212121 222221 222211 21 221 2    
( Чечим ) RegEx: туруктуу сөз айкаштарын өздөштүрүү үчүн 20 кыска кадам. 4-бөлүк.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION