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

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

Qrupda dərc edilmişdir
RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. Hissə 1 Orijinal burada Son hissədə biz ən sadə müntəzəm ifadələri mənimsədik və artıq bir şey öyrəndik. Bu hissədə bir az daha mürəkkəb dizaynları öyrənəcəyik, amma inanın ki, göründüyü qədər çətin olmayacaq. RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  Hissə 2 - 1Beləliklə, davam edək!

Addım 8: Ulduz *və Artı İşarəsi+

RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  2-2 hissəİndiyə qədər biz az-çox yalnız verilmiş uzunluqdakı simləri uyğunlaşdıra bilmişik. Ancaq son problemlərdə indiyə qədər gördüyümüz notasiya ilə edə biləcəyimiz limitə yaxınlaşdıq. Məsələn, fərz edək ki, biz 3 simvollu Java identifikatorları ilə məhdudlaşmırıq, lakin istənilən uzunluqda identifikatorlarımız ola bilər. Əvvəlki nümunədə işləmiş bir həll aşağıdakı nümunədə işləməyəcək:
naxış: [a-zA-Z_$]\w\w 
sətir:   __e $12 3 3.2 fo Bar r a23 mm ab x
uyğunluqlar: ^^^ ^^^ ^^^ ^^^  
( Nümunə ) Qeydidentifikator etibarlı, lakin 3 simvoldan uzun olduqda, yalnız ilk üç simvol uyğunlaşdırılır. İdentifikator etibarlıdır, lakin 3 simvoldan azdırsa, regex onu ümumiyyətlə tapmır! Problem ondadır ki, mötərizəyə alınmış ifadələr, []məsələn, simvol sinifləri kimi tam bir simvola uyğun gəlir \w. Bu o deməkdir ki, yuxarıdakı normal ifadədəki hər hansı uyğunluq tam olaraq üç simvol uzunluğunda olmalıdır. Beləliklə, ümid etdiyimiz kimi işləmir. *Xüsusi simvollar və burada kömək edə bilər +. Bunlar hər hansı ifadənin sağına əlavə oluna bilən dəyişdiricilərdir ki, həmin ifadəyə bir dəfədən çox uyğun gəlir. Kleene Ulduzu (və ya "ulduz") *əvvəlki işarənin istənilən sayda, o cümlədən sıfır dəfə uyğunlaşdırılmalı olduğunu göstərəcək. Artı işarəsi +bir və ya bir neçə dəfə axtarış etməyiniz lazım olduğunu göstərəcək. Beləliklə, əvvəl gələn ifadə +məcburidir (ən azı bir dəfə), əvvəlki ifadə isə *isteğe bağlıdır, lakin göründüyü zaman istənilən sayda görünə bilər. İndi bu biliklə yuxarıdakı müntəzəm ifadəni düzəldə bilərik:
model: [a-zA-Z_$]\w* 
sətir:   __e Barr a23mm ab x uyğunluğu üçün $123 3.2 
: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Nümunə ) İndi biz istənilən uzunluqdakı etibarlı identifikatorları uyğunlaşdırırıq! Bingo! +Bəs əvəzinə istifadə etsək nə olardı *?
naxış: [a-zA-Z_$]\w+ 
sətir:   __e Barr a23mm ab x üçün $123 3.2
uyğunluqlar: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ 
( Nümunə ) Son matçı buraxdıq х. Bunun səbəbi, +ən azı bir simvolun uyğunlaşdırılmasını tələb etməsidir, lakin []əvvəlki mötərizəli ifadə \w+simvolu artıq “yemiş” olduğundan x, artıq simvol yoxdur, ona görə də uyğunluq uğursuz olur. Nə vaxt istifadə edə bilərik +? Ən azı bir uyğunluq tapmaq lazım olduqda, lakin verilən ifadənin neçə dəfə uyğun olmasının əhəmiyyəti yoxdur. Məsələn, ondalıq nöqtəsi olan hər hansı rəqəmi tapmaq istəsək:
naxış: \d*\.\d+ 
sətir:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
uyğunluq: ^^^^^ ^^ ^^^ ^^^^^^^^^^^^^^^^  
( Nümunə ) Qeydondalık nöqtənin solundakı rəqəmləri isteğe bağlı etməklə biz həm 0.011, həm də .2-ni tapa bildik. \.Bunu etmək üçün biz tam olaraq bir onluq nöqtəni ilə və onluq nöqtənin sağındakı ən azı bir rəqəmi ilə uyğunlaşdırmalı idik \d+. Yuxarıdakı müntəzəm ifadə kimi bir rəqəmə uyğun gəlməyəcək 3., çünki uyğunlaşmaq üçün onluq nöqtənin sağında ən azı bir rəqəm lazımdır.

Həmişə olduğu kimi, gəlin bir neçə sadə problemi həll edək:

Aşağıdakı hissədə bütün ingilis sözlərini tapın.
naxış:
sətir: 3 plus 3 altıdır, lakin 4 plus üç 7-dir
matçlar:    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Həll ) Aşağıdakı siyahıda bütün fayl ölçüsü simvollarını tapın. Fayl ölçüləri rəqəmdən (onluq nöqtəsi olan və ya olmayan) və ardınca KB, MBGBya işarəsindən ibarət olacaq TB:
naxış:
sətir:   11TB 13 14.4MB 22HB 9.9GB TB 0KB 
uyğun gəlir: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Həll )

Addım 9: "isteğe bağlı" sual işarəsi?

RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  2-3 hissəSon problemi həll etmək üçün artıq regex yazmısınız? Bu işlədi? İndi onu burada tətbiq etməyə çalışın:
naxış:
sətir: 1..3KB 5...GB ..6TB
uyğun gəlir:  
Aydındır ki, bu təyinatların heç biri etibarlı fayl ölçüsü deyil, ona görə də yaxşı müntəzəm ifadə onların heç birinə uyğun gəlməməlidir. Son problemi həll etmək üçün yazdığım həll, heç olmasa qismən hamısına uyğun gəlir:
nümunə: \d+\.*\d*[KMGT]B 
sətri:   1..3KB  5...GB .. 6TB 
uyğunluq: ^^^^^^ ^^^^^^ ^^^ 
( Nümunə ) Bəs problem nədir? Əslində, əgər varsa, yalnız bir onluq nöqtəni tapmaq lazımdır. Lakin *o, sıfır daxil olmaqla istənilən sayda uyğunluğa imkan verir. Yalnız sıfır dəfə və ya bir dəfə uyğunlaşdırmağın bir yolu varmı? Ancaq bir dəfədən çox deyil? Əlbəttə var. "isteğe bağlı" ?sıfıra və ya əvvəlki simvollardan birinə uyğun gələn dəyişdiricidir, lakin daha çox deyil:
nümunə: \d+\.?\d*[KMGT]B 
sətri: 1.. 3KB 5...GB .. 6TB 
uyğunluq:     ^^^ ^^^ 
( Nümunə ) Biz burada bir həllə daha yaxınıq, lakin bu, bizə lazım olan tam olaraq deyil. Bunu bir az sonra bir neçə addımda necə düzəltməyə baxacağıq.

Bu arada bu problemi həll edək:

Bəzi proqramlaşdırma dillərində (məsələn, Java), bəzi tam və üzən nöqtəli (nöqtə) nömrələri adi int/double kimi deyil, uzun/float (müvafiq olaraq) kimi qəbul edilməli olduğunu göstərmək üçün l/ Lf/ ilə izlənilə bilər. FAşağıdakı sətirdə bütün etibarlı "uzun" nömrələri tapın:
naxış:
sim:   13L uzun 2l 19 L lL 0 
uyğunluq: ^^^ ^^ ^^ ^ 
( Həll )

Addım 10: "və ya" işarəsi|

RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  2-4 hissə8-ci addımda müxtəlif növ üzən nöqtə nömrələrini tapmaqda çətinlik çəkdik:
naxış: \d*\.\d+ 
sətir:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
uyğunluq: ^^^^^ ^^ ^^^ ^^^^^^^^^^^^^^^^  
Yuxarıdakı nümunə ondalıq nöqtəsi olan nömrələrə və onluq nöqtənin sağında ən azı bir rəqəmə uyğun gəlir. Bəs biz də kimi sətirləri uyğunlaşdırmaq istəsək necə olar 0.? (Onluq nöqtənin sağında rəqəm yoxdur.) Biz belə bir nizamlı ifadə yaza bilərik:
naxış: \d*\.\d* 
sətir:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
uyğunluqlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^ 
( Nümunə ) Bu uyğun gəlir , lakin yuxarıda gördüyünüz kimi 0.bir nöqtəyə də uyğun gəlir . .Əslində uyğunlaşdırmağa çalışdığımız şey iki fərqli sim sinfidir:
  1. ondalık nöqtənin sağında ən azı bir rəqəm olan nömrələr
  2. ondalık nöqtənin solunda ən azı bir rəqəmi olan ədədlər
Bir-birindən asılı olmayan aşağıdakı 2 normal ifadəni yazaq:
naxış: \d*\.\d+ 
sətir:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
matçlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
naxış: \d+\.\d* 
sətir:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
matçlar: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ 
42Bu halların heç birində , 56ya alt sətirlərinin .mühərrik tərəfindən tapılmadığını görürük . Tələb olunan nəticəni əldə etmək üçün bu müntəzəm ifadələri birləşdirmək bizə zərər verməz. Buna necə nail ola bilərik? "Və ya" işarəsi |müntəzəm ifadədə eyni vaxtda bir neçə mümkün uyğunluq ardıcıllığını təyin etməyə imkan verir. Necə ki, []"və ya" işarəsi bizə alternativ tək simvolları təyin etməyə imkan verir, |biz də alternativ çox simvollu ifadələri təyin edə bilərik. Məsələn, "it" və ya "pişik" tapmaq istəsək, belə bir şey yaza bilərik:
naxış: \w\w \ w 
simli:   Aydındır ki , it pişikdən daha yaxşı ev heyvanıdır .
matçlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( Nümunə ) ... lakin bu, "söz" sinfinin bütün üçlü simvol ardıcıllığına uyğun gəlir. Ancaq "it" və "pişik" hətta ortaq hərflərə sahib deyillər, buna görə də kvadrat mötərizələr burada bizə kömək etməyəcək. Hər iki sözə və yalnız bu iki sözə uyğun gələn istifadə edə biləcəyimiz ən sadə normal ifadə budur:
model: it|pişik 
simli: Aydındır ki, it pişikdən daha yaxşı ev heyvanıdır .
uyğunluqlar:               ^^^ ^^^ 
( Nümunə ) Normal ifadə mühərriki əvvəlcə simvolun sol tərəfindəki bütün ardıcıllığı uyğunlaşdırmağa çalışır |, lakin uğursuz olarsa, simvolun sağındakı ardıcıllığı uyğunlaşdırmağa çalışır |. Birdən çox simvol |ikidən çox alternativ ardıcıllığa uyğun gəlmək üçün zəncirlənə bilər:
model: it |pişik|pet 
simli: Aydındır ki, it pişikdən daha yaxşı ev heyvanıdır .
uyğunluqlar:               ^^^ ^^^ ^^^ 
( Nümunə )

İndi bu addımı daha yaxşı başa düşmək üçün başqa bir neçə problemi həll edək:

|Bu kimi nəticə çıxarmaq üçün yuxarıdakı onluq nizamlı ifadəni düzəltmək üçün işarədən istifadə edin :
naxış:
sətir:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
uyğunluqlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
( Həlli ) Əvvəlki addımın sonundakı problemdə müzakirə edildiyi kimi, həm tam, həm də üzən nöqtə (nöqtə) nömrələrinə uyğun gələn vahid müntəzəm ifadə yaratmaq üçün işarə |, simvol sinifləri, "isteğe bağlı" və s. istifadə edin (bu problem bir az ?daha mürəkkəb, bəli ;))
naxış:
sətir:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
uyğunluqlar: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Həll ) Normal ifadələri mənimsəmək üçün 20 qısa addım. Part 3 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