JavaRush /Java блогы /Random-KK /RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 3-...
Artur
Деңгей
Tallinn

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 3-бөлім

Топта жарияланған
RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 1-бөлім. RegEx: тұрақты өрнектерді меңгеруге арналған 20 қысқа қадам. 2-бөлім: Бұл бөлімде біз сәл күрделірек нәрселерге көшеміз. Бірақ оларды меңгеру, бұрынғыдай, қиын болмайды. Мен RegEx бастапқыда көрінгеннен оңайырақ екенін қайталаймын және оны меңгеріп, оны іс жүзінде қолдана бастау үшін зымыран ғалымы болудың қажеті жоқ. Бұл мақаланың ағылшынша түпнұсқасы осында . Тұрақты сөз тіркестерін меңгеруге арналған 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» әріптері болса, олардың кез келгені «қалқымалы» болып табылады. «Ұзын» түсіру тобында бізде бір ғана нұсқа бар - бізде «l» немесе «L» таңбасынан кейін 1 немесе одан да көп сан болуы керек. Тұрақты өрнек механизмі берілген жолда осы ішкі жолдарды іздейді және оларды сәйкес түсіру тобына индекстейді. назар аударыңызбіз оларға "l", "L", "f" немесе "F" қосылмайтын сандардың ешқайсысына сәйкес келмейтінімізді. Бұл сандарды қалай жіктеу керек? Егер оларда ондық нүкте болса, Java тілі әдепкі бойынша «қос» болады. Әйтпесе, олар «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 
сәйкестік: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
топ:    2 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]+) 
жол:   Ким Джобтың Сю Кло йд Мох р Нго Рок к.
сәйкестіктер: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
топ:    111 111 11 111 111 111 111   
( Мысал ) Әдепкі бойынша, тұрақты өрнек механизмдерінің көпшілігі біз осы уақытқа дейін көрген негізгі таңбаларға қарсы ашкөз сәйкестікті пайдаланады. Бұл тұрақты өрнек механизмі берілген тұрақты өрнекте мүмкіндігінше ертерек анықталған ең ұзын топты түсіретінін білдіреді. Жоғарыдағы екінші топ, мысалы, «Джобс» және «Клойд» сияқты атаулардағы көбірек таңбаларды түсіре алса да, бірақ бұл атаулардың алғашқы үш таңбасын бірінші түсіру тобы басып алғандықтан, оларды екінші топ қайта түсіре алмайды. . Енді кішігірім түзету жасайық - алдымен нақтырақ (ұзынырақ) топты қойып, түсіру топтарының ретін өзгертіңіз:
үлгі: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
жол:   Ким Джобс Сю Клойд Мор Нго Рок .
сәйкестіктер: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
( Мысалы )

Тапсырма... бұл жолы бір ғана :)

«Нақтырақ» үлгі әрқашан дерлік «ұзақ» дегенді білдіреді. «Сөздердің» екі түрін тапқымыз келеді делік: алдымен дауысты дыбыстардан басталатындар (нақтырақ айтқанда), содан кейін дауысты дыбыстардан басталмайтындар (басқа сөз). Осы екі топқа сәйкес келетін жолдарды түсіру және анықтау үшін тұрақты өрнек жазып көріңіз. (Төмендегі топтар нөмірленген емес, әріппен жазылған. Қай топ біріншіге, қайсысы екіншісіне сәйкес келетінін анықтау керек.)
үлгі:
string:   pds6f uub 24r2gp ewqrty l ui_op 
сәйкестіктері: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^^^^^ 
топ:    NNNNN ВВВ NNNNNN ВВВВВ Н ВВВВВ
( Шешім ) Жалпы, тұрақты өрнек неғұрлым дәл болса, соғұрлым ол ұзағырақ болады. Ол неғұрлым дәл болса, сізге қажет емес нәрсені түсіру ықтималдығы соғұрлым аз болады. Сондықтан олар қорқынышты көрінуі мүмкін, бірақ ұзағырақ регекстер ~= жақсырақ регекстер. Өкінішке орай .

13-қадам: {}Қайталаудың белгілі бір саны үшін бұйра жақшалар

Тұрақты сөз тіркестерін меңгеруге арналған 20 қысқа қадам.  3 - 4 бөлімАлдыңғы қадамдағы фамorялары бар мысалда бізде бір үлгіде қайталанатын 2 дерлік топ болды:
үлгі: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
жол:   Ким Джобс Сю Клойд Мор Нго Рок .
сәйкестіктер: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
топ:    222 1111 22 11111 1111 222 1111    
Бірінші топқа төрт немесе одан да көп әріптен тұратын фамorялар қажет болды. Екінші топқа үш немесе одан да аз әріптері бар фамorяларды түсіру керек болды. [a-z]Осы топтарды қайта-қайта қайталаудан гөрі мұны жазудың оңай жолы бар ма ? Бұл үшін бұйра жақшаларды пайдалансаңыз болады {}. Бұйра жақшалар {}алдыңғы таңбаның немесе түсіру тобының сәйкестіктерінің ең аз және (міндетті емес) ең көп санын анықтауға мүмкіндік береді. Қолданудың үш жағдайы бар {}:
{X} // дәл X рет сәйкес келеді
{X,} // сәйкес келеді >= X рет
{X,Y} // >= X және <= Y ретіне сәйкес келеді
Міне, осы үш түрлі синтаксистің мысалдары:
үлгі: [az]{11} 
жол:   humuhumunuk unukuapua'a.
сәйкес келеді: ^^^^^^^^^^^   
( Мысалы )
үлгі: [az]{18,} 
жол:   humuhumunukunukuapua 'a.
сәйкес келеді: ^^^^^^^^^^^^^^^^^^^^^    
( Мысалы )
үлгі: [az]{11,18} 
жол:   humuhumunukunukuap ua'a.
сәйкес келеді: ^^^^^^^^^^^^^^^^^^    
( Мысал ) Жоғарыдағы мысалдарда ескеретін бірнеше жайттар бар.назар аудару:. Біріншіден, {X} белгісін қолданып, алдыңғы таңба немесе топ дәл сол санға (X) сәйкес келеді. Егер «сөзде» үлгіге сәйкес келетін (X санынан гөрі) көбірек таңбалар болса (бірінші мысалда көрсетілгендей), олар сәйкестікке қосылмайды. Егер таңбалар саны X-тен аз болса, онда толық сәйкестік сәтсіз болады (бірінші мысалда 11-ден 99-ға өзгертіп көріңіз). Екіншіден, {X,} және {X,Y} белгілеулері ашкөз. Олар берілген тұрақты өрнекті қанағаттандыра отырып, мүмкіндігінше көп таңбаларды сәйкестендіруге тырысады. {3,7} көрсетсеңіз, 3-7 таңба сәйкестендіріледі және келесі 7 таңба жарамды болса, барлық 7 таңба сәйкестендіріледі. {1,} мәнін көрсетсеңіз және келесі 14 000 таңбаның барлығы сәйкес келсе, сол 14 000 таңбаның барлығы сәйкес жолға қосылады. Жоғарыдағы өрнекті қайта жазу үшін бұл білімді қалай пайдалана аламыз? [a-z]Ең қарапайым жақсарту көрші топтарды -мен ауыстыру болуы мүмкін [a-z]{N}, мұнда N сәйкесінше таңдалады:
үлгі: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...бірақ бұл жағдайды жақсартпайды. Бірінші түсіру тобын қараңыз: бізде [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" - жақсы құпия сөз, сондықтан regex бұл реттілікте бос орындар немесе әріптік таңбалар жоқ екенін түсінгенде , ол оң жақтағы құпия сөзді талап ететін "таңбаның дәл алдында береді . (Себебі арқылы таңбаларды құпия сөздердің ішінен табу мүмкін емес екенін "көрсеттік .) Тұрақты өрнек механизмі бұл таңбалардың белгілі бір тұрақты өрнекке сәйкес келмейтініне көз жеткізгеннен кейін, ол тоқтаған жерінен - ​​таңба болған жерде қайта іске қосылады . Xanadu.2112" оң жақта. Сол жерден ол бір кеңістік кейіпкерін, ал басқа кейіпкерді көреді - ол үшін бұл дұрыс емес пароль! Негізінен ол осы ретті тауып , әрі қарай жүреді. Бұл біздің алғымыз келетін нәрсе емес... Құпия сөздің бірінші символы бос орын болмауы керек екенін көрсетсек, жақсы болар еді . Мұны істеудің жолы бар ма? (Осы кезге дейін сіз менің барлық риторикалық сұрақтарыма жауап «иә» екенін түсінген шығарсыз.) Иә! Мұндай жол бар! Көптеген тұрақты өрнек механизмдері "сөз шекарасы" сияқты қашу ретін қамтамасыз етеді . "Сөз шекарасы" - нөлдік ені бар көшу тізбегі, біртүрлі, сөз шекарасына сәйкес келеді. Есіңізде болсын, біз «сөз» дегенде сыныптағы таңбалардың кез келген тізбегін немесе . Сөз шекарасының сәйкестігі тізбектің алдындағы немесе бірден кейінгі таңба сөз таңбасы болуы керек дегенді білдіреді. Дегенмен, сәйкестендіру кезінде біз бұл таңбаны түсірілген ішкі жолға қоспаймыз. Бұл нөлдік ені. Мұның қалай жұмыс істейтінін көру үшін шағын мысалды қарастырайық: "[^"]""" "\b\b\w[A-Za-z0-9_]\bне
үлгі: \b[^ ]+\b 
жол:   Ve still vant ze money , Lebowski .
сәйкес келеді: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Мысал ) Тізбек әріптік [^ ]бос орын таңбасы болып табылмайтын кез келген таңбаға сәйкес келуі керек. Неліктен бұл ,ақшадан кейінгі үтірге немесе .Лебовскийден кейінгі нүктеге сәйкес келмейді? Себебі үтір ,мен нүкте .сөз таңбалары емес, сондықтан сөз таңбалары мен сөз емес таңбалар арасында шекаралар жасалады. Олар yтаңбаның соңы арасында пайда болады. ақша сөзі және ,одан кейінгі үтір . және " iЛебовский сөзі мен .одан кейінгі нүкте (нүкте/нүкте) арасында. Тұрақты өрнек осы сөздердің шекараларына сәйкес келеді (бірақ оларды анықтауға көмектесетін сөз емес таңбаларға емес). \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. Жоғарыдағы мысалда біз not таңбаларына рұқсат бермегендіктен \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 талдаушы тұрақты өрнекті жазыңыз .
үлгі:
жол:   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