JavaRush /Java Blogu /Random-AZ /RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. 3-...
Artur
Səviyyə
Tallinn

RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. 3-cü hissə

Qrupda dərc edilmişdir
RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. Hissə 1. RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. 2-ci hissə: Bu hissədə bir az daha mürəkkəb olan şeylərə keçəcəyik. Ancaq onları mənimsəmək, əvvəlki kimi, çətin olmayacaq. Təkrar edirəm ki, RegEx əslində ilk göründüyündən daha asandır və onu mənimsəmək və praktikada istifadə etməyə başlamaq üçün raket alimi olmağa ehtiyac yoxdur. Bu məqalənin ingiliscə orijinalı buradadır . Normal ifadələri mənimsəmək üçün 20 qısa addım.  Hissə 3 - 1

Addım 11: Mötərizələr ()Qrupları Tutma kimi

Normal ifadələri mənimsəmək üçün 20 qısa addım.  3-2 hissəSonuncu məsələdə biz tam ədədlərin müxtəlif növlərini və üzən nöqtə (nöqtə) rəqəmli dəyərləri axtardıq. Lakin müntəzəm ifadə mühərriki bu iki dəyər növü arasında fərq qoymadı, çünki hər şey bir böyük müntəzəm ifadədə ələ keçirildi. Mini-naxışlarımızı mötərizə içərisinə daxil etsək, müntəzəm ifadə mühərrikinə müxtəlif uyğunluq növlərini fərqləndirmək üçün deyə bilərik:
model: ([AZ])|([az]) 
string:   Boliviyanın hazırkı prezidenti Evo Moralesdir .
matçlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:    122 2222222 122222222 22 1222222 22 122 1222222  
( Nümunə ) Yuxarıdakı müntəzəm ifadə 1-dən başlayaraq indekslənən iki tutma qrupunu müəyyən edir. Birinci tutma qrupu istənilən tək böyük hərflə, ikinci çəkmə qrupu isə hər hansı bir kiçik hərflə uyğun gəlir. |'və ya' işarəsini və mötərizələri tutma qrupu kimi istifadə etməklə (), biz bir çox növ sətirlərə uyğun gələn tək normal ifadəni təyin edə bilərik. Bunu məqalənin əvvəlki hissəsindən uzun/float axtarış regeximizə tətbiq etsək, onda regex mühərriki müvafiq qruplarda müvafiq uyğunluqları tutacaq. Alt sətirin hansı qrupa uyğun olduğunu yoxlamaqla, onun float dəyəri və ya uzun dəyər olduğunu dərhal müəyyən edə bilərik:
nümunə: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) sətir: 42L 
12   x 3.4f 6l 3.3 0F LF .2F 0.
matçlar: ^^^ ^^^^ ^^ ^^ ^^^ 
qrup:    222 1111 22 11 111  
( Nümunə ) Bu müntəzəm ifadə olduqca mürəkkəbdir və onu daha yaxşı başa düşmək üçün gəlin onu parçalayaq və bu nümunələrin hər birinə nəzər salaq:
( // istənilən "float" alt sətrinə uyğun gəlir
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //OR
( // istənilən "uzun" alt sətirə uyğun gəlir
  \d+[lL]
)
|Mötərizədə işarə və tutma qrupları ()bizə müxtəlif növ alt sətirləri uyğunlaşdırmağa imkan verir. Bu halda biz ya "float" üzən nöqtəli ədədləri, ya da "uzun" uzun tam ədədləri uyğunlaşdırırıq.
(
  \d*\.\d+[fF] // decimal nöqtəsinin sağında 1+ rəqəm
  |
  \d+\.\d*[fF] // decimal nöqtəsinin solunda 1+ rəqəm
  |
  \d+[fF] // nöqtə yoxdur, yalnız 1+ rəqəm
)
|
(
  \d+[lL] // nöqtə yoxdur, yalnız 1+ rəqəm
)
"Float" tutma qrupunda üç seçimimiz var: onluq nöqtənin sağında ən azı 1 rəqəmi olan nömrələr, onluq nöqtənin solunda ən azı 1 rəqəmi olan nömrələr və ondalık nöqtəsi olmayan nömrələr. Onlardan hər hansı biri “f” və ya “F” hərflərinin sonuna əlavə olunduğu müddətcə “floats”dır. "Uzun" tutma qrupunun içərisində yalnız bir seçimimiz var - 1 və ya daha çox rəqəmdən sonra "l" və ya "L" simvolu olmalıdır. Normal ifadə mühərriki bu alt sətirləri verilmiş sətirdə axtaracaq və onları müvafiq tutma qrupunda indeksləşdirəcək. Qeyd"l", "L", "f" və ya "F" əlavə olunmayan nömrələrin heç birinə uyğun gəlmirik. Bu rəqəmlər necə təsnif edilməlidir? Yaxşı, onda bir nöqtə varsa, Java dili standart olaraq "ikiqat" olur. Əks halda onlar "int" olmalıdır.

Gəlin öyrəndiklərimizi bir neçə tapmaca ilə birləşdirək:

Yuxarıdakı regexə daha iki tutma qrupu əlavə edin ki, o, ikiqat və ya int nömrələrini də təsnif etsin. (Bu, başqa bir çətin sualdır, bir müddət çəksə ruhdan düşməyin, son çarə olaraq mənim həllimə baxın.)
naxış:
sətir:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
uyğunluqlar: ^^^ ^^^^^^ ^^ ^^^ ^^ ^^^ ^^ 
qrup:    333 44 1111 33 222 11 111 22
( Həlli ) Növbəti problem bir az daha sadədir. Aşağıdakı yaşları çeşidləmək üçün mötərizəli tutma qrupları (), 'və ya' işarəsi |və simvol diapazonlarından istifadə edin: "ABŞ-da içmək qanuni". (>= 21) və "ABŞ-da içməyə icazə verilmir" (<21):
naxış:
sətir:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
uyğunluq: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
qrup:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Həll )

Addım 12: Əvvəlcə Daha Xüsusi Uyğunluqları Müəyyən edin

Normal ifadələri mənimsəmək üçün 20 qısa addım.  3-3-cü hissəƏgər "qanuni içki içənləri" ikinci deyil, birinci tutma qrupu kimi təyin etməyə çalışsanız, son tapşırıqla bağlı bəzi problemlərlə üzləşmiş ola bilərsiniz. Səbəbini anlamaq üçün başqa bir misala baxaq. Tutaq ki, biz 4 simvoldan az olan soyadları və 4 və ya daha çox simvoldan ibarət soyadları ayrıca qeyd etmək istəyirik. Gəlin ilk tutma qrupuna daha qısa adlar verək və nə baş verdiyini görək:
model: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
string:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
matçlar: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
qrup:    111 111 11 111 111 111 111   
( Nümunə ) Defolt olaraq, əksər müntəzəm ifadə mühərrikləri indiyə qədər gördüyümüz əsas simvollara qarşı acgöz uyğunluqdan istifadə edir. Bu o deməkdir ki, müntəzəm ifadə mühərriki təmin edilmiş müntəzəm ifadədə mümkün qədər erkən müəyyən edilmiş ən uzun qrupu tutacaq. Beləliklə, yuxarıdakı ikinci qrup, məsələn, "Jobs" və "Cloyd" kimi adlarda daha çox simvol tuta bilsə də, lakin bu adların ilk üç simvolu artıq birinci tutma qrupu tərəfindən ələ keçirildiyinə görə, ikinci qrup tərəfindən yenidən ələ keçirilə bilməz. . İndi kiçik bir düzəliş edək - sadəcə olaraq daha konkret (daha uzun) qrupu əvvəlcə yerləşdirərək tutma qruplarının sırasını dəyişdirin:
model: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
matçlar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
qrup:    222 1111 22 11111 1111 222 1111    
( Nümunə )

Tapşırıq... bu dəfə yalnız bir :)

"Daha konkret" nümunə demək olar ki, həmişə "daha uzun" deməkdir. Tutaq ki, biz iki növ “söz” tapmaq istəyirik: əvvəlcə saitlərlə başlayanlar (daha dəqiq desək), sonra saitlərlə başlamayanlar (başqa sözlər). Bu iki qrupa uyğun gələn sətirləri tutmaq və müəyyən etmək üçün müntəzəm ifadə yazmağa çalışın. (Aşağıdakı qruplar nömrələnmiş deyil, hərflə yazılmışdır. Hansı qrupun birinciyə, hansının ikinciyə uyğun olması lazım olduğunu müəyyənləşdirməlisiniz.)
naxış:
string:   pds6f uub 24r2gp ewqrty l ui_op 
uyğunluqları: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^^^^^ 
qrup:    NNNNN VVV NNNNNN VVVVVVV N VVVVV
( Həll ) Ümumiyyətlə, müntəzəm ifadəniz nə qədər dəqiq olarsa, bir o qədər də bitəcək. Və nə qədər dəqiq olsa, ehtiyacınız olmayan bir şeyi ələ keçirmə ehtimalınız bir o qədər az olar. Beləliklə, onlar qorxulu görünsə də, daha uzun regexlər ~= daha yaxşı regexlər. Təəssüf ki .

{}Addım 13: Müəyyən sayda təkrar üçün buruq mötərizələr

Normal ifadələri mənimsəmək üçün 20 qısa addım.  3-4-cü hissəƏvvəlki addımdakı soyadları olan nümunədə bir nümunədə demək olar ki, təkrarlanan 2 qrupumuz var idi:
model: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
matçlar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
qrup:    222 1111 22 11111 1111 222 1111    
Birinci qrup üçün dörd və ya daha çox hərfdən ibarət soyadlara ehtiyacımız var idi. İkinci qrup üç və ya daha az hərflə soyadları tutmalı idi. [a-z]Bunu yazmağın bu qrupları təkrar-təkrar təkrarlamaqdan daha asan yolu varmı ? Bunun üçün əyri mötərizələrdən istifadə etsəniz mövcuddur {}. Buruq mötərizələr {}əvvəlki xarakter və ya tutma qrupunun minimum və (istəyə görə) maksimum uyğunluq sayını təyin etməyə imkan verir. Üç istifadə halı var {}:
{X} // X dəfə tam uyğun gəlir
{X,} // >= X dəfə uyğun gəlir
{X,Y} // >= X və <= Y dəfə uyğun gəlir
Bu üç fərqli sintaksisin nümunələri:
naxış: [az]{11} 
sətir:   humuhumunuk unukuapua'a.
uyğunluqlar: ^^^^^^^^^^^   
( Nümunə )
naxış: [az]{18,} 
sətir:   humuhumunukunukuapua 'a.
matçlar: ^^^^^^^^^^^^^^^^^^^^^^^    
( Nümunə )
naxış: [az]{11,18} 
sətir:   humuhumunukunukuap ua'a.
matçlar: ^^^^^^^^^^^^^^^^^^    
( Nümunə ) Yuxarıdakı misallarda bir neçə məqamı qeyd etmək lazımdır.Qeyd:. Birincisi, {X} notasiyasından istifadə edərək, əvvəlki simvol və ya qrup tam olaraq həmin rəqəmə (X) uyğun gələcək. Əgər "sözdə" (birinci misalda göstərildiyi kimi) naxışa uyğun ola biləcək daha çox simvol varsa, onlar uyğunluğa daxil edilməyəcəklər. Əgər simvolların sayı X-dən azdırsa, tam uyğunluq uğursuz olacaq (birinci misalda 11-dən 99-a dəyişməyə cəhd edin). İkincisi, {X,} və {X,Y} qeydləri acgözlükdür. Onlar verilən müntəzəm ifadəni təmin etməklə yanaşı, mümkün qədər çox simvolu uyğunlaşdırmağa çalışacaqlar. {3,7} göstərsəniz, 3-7 simvol uyğunlaşdırıla bilər və növbəti 7 simvol etibarlıdırsa, bütün 7 simvol uyğunlaşdırılacaq. Əgər {1,} təyin etsəniz və növbəti 14 000 simvolun hamısı uyğun gəlirsə, o zaman həmin simvolların 14 000-i müvafiq sətirə daxil ediləcək. Yuxarıdakı ifadəmizi yenidən yazmaq üçün bu bilikdən necə istifadə edə bilərik? Ən sadə təkmilləşdirmə qonşu qrupları [a-z]ilə əvəz etmək ola bilər [a-z]{N}, burada N müvafiq olaraq seçilir:
naxış: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...amma bu, işləri yaxşılaşdırmır. İlk tutma qrupuna baxın: bizdə [a-z]{2}(tam olaraq 2 kiçik hərfə uyğun gəlir) və ardınca [a-z]+(1 və ya daha çox kiçik hərflərə uyğun gəlir) var. Buruq mötərizələrdən istifadə edərək 3 və ya daha çox kiçik hərf tələb etməklə bunu sadələşdirə bilərik:
naxış: ([AZ][az]{3,})|([AZ][az]?[az]?) 
İkinci tutma qrupu fərqlidir. Bu soyadlarda üç simvoldan çox olmamaq lazımdır, yəni bizim yuxarı limitimiz var, lakin aşağı limitimiz sıfırdır:
nümunə: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Müntəzəm ifadələrdən istifadə edərkən spesifiklik həmişə daha yaxşıdır, buna görə də orada dayanmaq müdrik olardı, lakin mən kömək edə bilmirəm ki, bir-birinin yanında olan bu iki simvol diapazonu ( [AZ][az]) az qala “söz simvolu” sinfinə bənzəyir, \w( [A-Za-z0-9_]) . Əgər məlumatlarımızın yalnız yaxşı formatlaşdırılmış soyadlardan ibarət olduğuna əmin olsaydıq, o zaman adi ifadəmizi sadələşdirib sadə şəkildə yaza bilərdik:
nümunə: (\w{4,})|(\w{1,3}) 
Birinci qrup 4 və ya daha çox "söz simvolu"ndan ( [A-Za-z0-9_]) ibarət istənilən ardıcıllığı, ikinci qrup isə 1-dən 3-ə qədər "söz simvolu" (daxil olmaqla) olan istənilən ardıcıllığı çəkir. Bu işləyəcək?
model: (\w{4,})|(\w{1,3}) 
sətir:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
matçlar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
qrup:    222 1111 22 11111 1111 222 1111    
( Misal ) İşlədi! Bu yanaşma haqqında necə? Və əvvəlki nümunəmizdən daha təmizdir. Birinci tutma qrupu dörd və ya daha çox simvolu olan bütün soyadlara uyğun gəldiyi üçün biz hətta ikinci tutma qrupunu sadəcə olaraq dəyişə bilərik \w+, çünki bu, bizə qalan bütün soyadları (1, 2 və ya 3 simvol ilə) tutmağa imkan verəcəkdir:
naxış: (\w{4,})|(\w+) 
sətir:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
matçlar: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
qrup:    222 1111 22 11111 1111 222 1111    
( Nümunə )

Gəlin beynə bunu öyrənməyə və aşağıdakı 2 problemi həll etməyə kömək edək:

{}7-ci addımdan sosial təhlükəsizlik nömrəsi axtarışı üçün müntəzəm ifadəni yenidən yazmaq üçün əyri mötərizələrdən istifadə edin :
naxış:
sətir: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
uyğunluqlar:              ^^^^^^^^^^^
( Həll ) Təsəvvür edin ki, veb-saytın parol gücü yoxlayıcısı istifadəçi parollarının 6 və 12 simvol arasında olmasını tələb edir. Aşağıdakı siyahıda etibarsız parolları qeyd edən müntəzəm ifadə yazın . Asan uyğunlaşma üçün hər bir parol mötərizə içərisindədir (), ona görə də müntəzəm ifadənin hərfi ()simvolik simvollarla başladığı və bitdiyinə əmin olun. İpucu: parollarda [^()]və ya oxşar mötərizələrə icazə vermədiyinizə əmin olun, əks halda bütün sətirlə uyğunlaşacaqsınız!
naxış:
sətir:   (12345) (parolum) (Xanadu.2112) (su_do) (OfSalesmen!)
matçlar: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^  
( Həll )

Addım 14: \bSıfır Genişlik Sərhəd Simvolu

Normal ifadələri mənimsəmək üçün 20 qısa addım.  3-5-ci hissəSon tapşırıq olduqca çətin idi. ""Bəs parolları mötərizə əvəzinə dırnaq işarəsi ilə daxil etməklə işi bir az daha mürəkkəbləşdirsək necə olar ()? Sadəcə bütün mötərizə simvollarını sitat simvolları ilə əvəz etməklə oxşar həlli yaza bilərikmi?
model: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
sətir:   "12345" "parolum" "Xanadu.2112 " " su_do" " OfSalesmen! "
matçlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^  
( Nümunə ) Çox təsir edici olmadı. Artıq bunun səbəbini təxmin etmisiniz? Problem ondadır ki, biz burada səhv parollar axtarırıq. "Xanadu.2112" yaxşı paroldur, ona görə də regex bu ardıcıllığın boşluq və ya hərfi simvoldan ibarət olmadığını başa düşdükdə , sağ tərəfdəki parolu uyğunlaşdıran "simvoldan dərhal əvvəl verir . "(Çünki qeyd etdik ki, "istifadə edərək parolların içərisində simvollar tapıla bilməz [^"].) Normal ifadə mühərriki həmin simvolların müəyyən bir normal ifadəyə uyğun gəlmədiyinə əmin olduqdan sonra, o, tam olaraq qaldığı yerdən - simvolun olduğu yerdə yenidən işləyir ". Xanadu.2112" sağda. Oradan o, bir boşluq simvolunu, başqa bir simvolu görür "- onun üçün bu səhv paroldur! Əsasən, o, bu ardıcıllığı tapır " "və davam edir. Bu heç də bizim əldə etmək istədiyimiz şey deyil... Şifrənin ilk simvolunun boşluq olmamasını qeyd etsək çox yaxşı olardı. Bunu etmək üçün bir yol varmı? (İndiyə qədər yəqin ki, bütün ritorik suallarımın cavabının “bəli” olduğunu başa düşmüsünüz.) Bəli! Belə bir yol var! Bir çox müntəzəm ifadə mühərrikləri "söz sərhədi" kimi bir qaçış ardıcıllığı təmin edir \b. "Söz sərhəddi" \bsıfır enli qaçış ardıcıllığıdır və qəribə də olsa, söz sərhədinə uyğun gəlir. Unutmayın ki, biz "söz" deyəndə ya sinifdəki hər hansı simvol ardıcıllığını, \wya da [A-Za-z0-9_]. Söz sərhədinin uyğunluğu o deməkdir ki, ardıcıllıqdan dərhal əvvəl və ya dərhal sonrakı simvol söz simvolu \bolmalıdır . неBununla belə, uyğunlaşdıqda, bu simvolu tutduğumuz alt sətirə daxil etmirik. Bu sıfır enidir. Bunun necə işlədiyini görmək üçün kiçik bir nümunəyə baxaq:
naxış: \b[^ ]+\b 
sətir:   Və hələ də pul yoxdur , Lebowski .
matçlar: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Nümunə ) Ardıcıllıq [^ ]hərfi boşluq simvolu olmayan istənilən simvola uyğun olmalıdır. ,Bəs niyə bu, puldan sonrakı vergül və ya Lebowskidən sonrakı " nöqtəsi ilə uyğun gəlmir .? Bunun səbəbi vergül ,və nöqtənin .söz simvolu olmadığına görə, söz simvolları ilə qeyri-söz simvolları arasında sərhədlər yaradılır. Onlar yişarənin sonu arasında görünür. pul sözü və ,ondan sonra gələn vergül . və " Lebowski sözü ilə ondan sonrakı idövr (tam nöqtə/nöqtə) arasında. .Normal ifadə bu sözlərin sərhədlərinə uyğun gəlir (lakin onları müəyyən etməyə kömək edən qeyri-söz simvollarına deyil). \bBəs şablonumuza ardıcıllığı daxil etməsək nə olar ?
naxış: [^ ]+ 
simli:   Və hələ də pul var, Lebowski. 
matçlar: ^^ ^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^  
( Misal ) Bəli, indi biz bu durğu işarələrini də tapırıq. İndi sitat gətirilən parollar üçün regexi düzəltmək üçün söz sərhədlərindən istifadə edək:
nümunə: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
sətir:   "12345" "parolum" " Xanadu. 2112" "su_do" "Satışdan kənar adamlar!"
matçlar: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^  
( Nümunə ) Söz sərhədlərini dırnaq işarələri ("\b ... \b") içərisinə yerləşdirməklə biz effektiv şəkildə deyirik ki, uyğun parolların ilk və sonuncu simvolları "söz simvolları" olmalıdır. Beləliklə, bu, burada yaxşı işləyir, lakin istifadəçi parolunun ilk və ya sonuncu simvolu söz simvolu deyilsə, o qədər də işləməyəcək:
nümunə: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\"
sətir: "aşağıdakı parolun qısaldılması" "C++"
uyğun gəlir:   
( Nümunə ) İkinci parolun çox qısa olmasına baxmayaraq, onun necə "etibarsız" kimi qeyd olunmadığına baxın. Sən olmalısanehtiyatlıardıcıllıqla \b, çünki onlar yalnız simvollar arasındakı sərhədlərə uyğun gəlir \wvə deyil \w. Yuxarıdakı misalda biz simvollara icazə vermədiyimiz üçün parollarda parolun birinci/son simvolu \warasındakı sərhədin söz sərhədi olmasına zəmanət verilmir . \\b

Bu addımı tamamlamaq üçün yalnız bir sadə problemi həll edəcəyik:

Söz sərhədləri, müəyyən simvol ardıcıllığına uyğun gəlmək istədiyimiz zaman sintaksisi vurğulayan mühərriklərdə faydalıdır, lakin onların yalnız sözün əvvəlində və ya sonunda (yaxud özlüyündə) baş verdiyinə əmin olmaq istəyirik. Deyək ki, biz sintaksis vurğulaması yazırıq və var sözünü vurğulamaq istəyirik, ancaq o, öz-özünə görünəndə (sözdəki digər simvollara toxunmadan). Bunun üçün müntəzəm ifadə yaza bilərsinizmi? Əlbəttə edə bilərsiniz, bu çox sadə bir işdir ;)
naxış:
sətir:   var varx _var ( var j) barvarcar * var var -> { var }
uyğunluqlar: ^^^ ^^^ ^^^ ^^^ ^^^  
( Həll )

^Addım 15: "xəttin başlanğıcı " kimi "karet " və $"sətrin sonu" kimi dollar işarəsi

Normal ifadələri mənimsəmək üçün 20 qısa addım.  3-6 hissəSöz sərhədi ardıcıllığı \b(məqalənin əvvəlki hissəsinin son addımından) müntəzəm ifadələrdə istifadə üçün mövcud olan yeganə xüsusi sıfır enli ardıcıllıq deyil. Ən populyar ikisi "karet" ^- "xəttin başlanğıcı" və dollar işarəsi $- "xəttin sonu"dur. Bunlardan birinin müntəzəm ifadələrinizə daxil edilməsi o deməkdir ki, uyğunluq mənbə sətirinin əvvəlində və ya sonunda görünməlidir:
naxış: ^start|end$ 
sətir:   başlanğıc son başlanğıc başlanğıc son başlanğıc başlanğıc son 
uyğunluqlar: ^^^^^ ^^^  
( Nümunə ) Əgər sətirinizdə sətir fasilələri varsa, o, ^startistənilən sətrin əvvəlindəki "başlanğıc" ardıcıllığına uyğun olacaq və end$istənilən sətrin sonundakı "son" ardıcıllığına uyğun olacaq (bunu burada göstərmək çətindir). Bu simvollar xüsusi ilə məhdudlaşdırıcıları olan verilənlərlə işləyərkən faydalıdır. ^"Sətrin başlanğıcı"ndan istifadə edərək 9-cu addımdan "fayl ölçüsü" məsələsinə qayıdaq . Bu nümunədə fayl ölçülərimiz " " boşluqları ilə ayrılmışdır. Beləliklə, hər bir fayl ölçüsünün əvvəlində boşluq simvolu və ya sətrin başlanğıcı olan bir nömrə ilə başlamasını istəyirik:
nümunə: (^| )(\d+|\d+\.\d+)[KMGT]B 
sətri:   6,6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
matçlar: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
qrup:    222 122 1222 12    
( Nümunə ) Biz artıq məqsədə çox yaxınıq! Ancaq siz görə bilərsiniz ki, hələ də kiçik bir problemimiz var: biz etibarlı fayl ölçüsündən əvvəl boşluq simvolunu uyğunlaşdırırıq. İndi biz normal ifadə mühərrikimiz onu tapdıqda bu tutma qrupunu (1) sadəcə olaraq görməməzliyə vura bilərik və ya növbəti addımda görəcəyimiz tutmayan qrupdan istifadə edə bilərik.

Bu arada ton üçün daha 2 problemi həll edək:

Son addımdakı sintaksisi vurğulama nümunəmizə davam etsək, bəzi sintaksis vurğulaması arxadakı boşluqları, yəni boşluq olmayan simvol ilə xəttin sonu arasında gələn hər hansı boşluqları qeyd edəcəkdir. Yalnız arxadakı boşluqları vurğulamaq üçün regex yaza bilərsinizmi?
naxış:
sətir: myvec <- c(1, 2, 3, 4, 5)  
uyğunluqlar:                          ^^^^^^^  
( Həll ) Sadə vergüllə ayrılmış dəyər (CSV) təhlilçisi vergüllə ayrılmış "tokenləri" axtaracaq. Ümumiyyətlə, boşluq dırnaq işarələrinə alınmasa, mənası yoxdur "". Vergüllər arasında işarələrə uyğun gələn, lakin dırnaqlar arasında olmayan boş yerə məhəl qoymayan (almayan) sadə CSV təhlili nizamlı ifadə yazın .
naxış:
sətir:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
uyğun gəlir: ^^ ^^^^ ^^^^^^^^^^^^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
qrup:    21 2221 2222212121 222221 222211 21 221 2    
( Həlli ) RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. 4-cü hissə.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION