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

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

Qrupda dərc edilmişdir
RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. Part 1 RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım. 2-ci hissə Normal ifadələri mənimsəmək üçün 20 qısa addım. 3-cü hissə Bu son hissə, ortada, əsasən nizamlı ifadə ustalarının işlətdiyi şeylərə toxunacaq. Ancaq əvvəlki hissələrdən material sizin üçün asan idi, elə deyilmi? Bu o deməkdir ki, siz bu materialı eyni rahatlıqla idarə edə bilərsiniz! Orijinal burada RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-cü hissə - 1 <h2>Addım 16: ələ keçirmədən qruplar (?:)</h2> RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-2 hissəƏvvəlki addımdakı iki nümunədə biz həqiqətən ehtiyac duymadığımız mətni çəkirdik. Fayl Ölçüləri tapşırığında biz fayl ölçülərinin ilk rəqəmindən əvvəlki boşluqları, CSV tapşırığında isə hər bir işarə arasındakı vergülləri qeyd etdik. Bu simvolları tutmağa ehtiyacımız yoxdur, lakin müntəzəm ifadəmizi strukturlaşdırmaq üçün onlardan istifadə etməliyik. Bunlar qrup tutmadan istifadə etmək üçün ideal variantlardır, (?:). Tutmayan qrup tam olaraq səsləndiyini edir - simvolları qruplaşdırmağa və müntəzəm ifadələrdə istifadə etməyə imkan verir, lakin onları nömrələnmiş qrupda tutmur:
naxış: (?:")([^"]+)(?:") 
sətir: Mən yalnız "bu sitatların içindəki mətni" istəyirəm .
matçlar:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:                 111111111111111111111111111    
( Nümunə ) Normal ifadə indi sitat gətirilən mətnə, eləcə də sitat simvollarının özünə uyğun gəlir, lakin tutma qrupu yalnız sitat gətirilən mətni tutdu. Niyə bunu etməliyik? Məsələ ondadır ki, əksər adi ifadə mühərrikləri adi ifadələrinizdə müəyyən edilmiş tutma qruplarından mətni bərpa etməyə imkan verir. Bizə lazım olmayan əlavə simvolları tutma qruplarımıza daxil etmədən kəsə bilsək, bu, mətni daha sonra təhlil etməyi və manipulyasiya etməyi asanlaşdıracaq. CSV analizatorunu əvvəlki addımdan necə təmizləmək olar:
nümunə: (?:^|,)\s*(?:\"([^",]*)\"|([^", ]*)) 
sətir:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , "", l 
uyğun gəlir: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
qrup:    2 1 111 2 2 111 2222 2 2    
( Nümunə(^|,) ) Burada <mark>diqqət yetirməli olan bir neçə şey var:</mark> Birincisi, çəkmə qrupunu tutmayan qrupa dəyişdiyimizə görə, biz artıq vergülləri çəkmirik (?:^|,). İkincisi, tutma qrupunu tutmayan qrup daxilində yerləşdirdik. Bu, məsələn, müəyyən bir ardıcıllıqla görünmək üçün bir qrup simvola ehtiyacınız olduqda faydalıdır, lakin siz yalnız həmin simvolların alt çoxluğuna əhəmiyyət verirsiniz. Bizim vəziyyətimizdə dırnaq içərisində görünmək üçün sitatsız simvollara və vergüllərə[^",]* ehtiyacımız var idi , lakin əslində sitat simvollarına ehtiyacımız yox idi, ona görə də onların tutulmasına ehtiyac yox idi . Nəhayət, <mark>qeyd edin</mark> ki, yuxarıdakı misalda simvollar kvə simvollar arasında sıfır uzunluqlu uyğunluq da var l. Sitatlar ""axtarılan alt sətirdir, lakin dırnaqlar arasında simvol yoxdur, ona görə də uyğun gələn alt sətirdə simvol yoxdur (uzunluğu sıfır). <h3>Biliklərimizi möhkəmləndirəkmi? Bu işdə bizə kömək edəcək iki yarım tapşırıq var:</h3> Tutmayan qruplardan (və qrupları və simvol siniflərini və s. ələ keçirmək) istifadə edərək, xəttdə yalnız düzgün formatlaşdırılmış fayl ölçülərini tutan müntəzəm ifadə yazın. aşağıda:
naxış:
sətir:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
matçlar: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
qrup:    11111 1111 11111 111    
( Həll ) HTML açılış teqləri ilə başlayır <və ilə bitir >. HTML bağlama teqləri simvol ardıcıllığı ilə başlayır </və simvolla bitir >. Teq adı bu simvollar arasında yerləşir. Yalnız aşağıdakı teqlərdə olan adları tutmaq üçün müntəzəm ifadə yaza bilərsinizmi? (Bu problemi tutmayan qruplardan istifadə etmədən həll edə bilərsiniz. Bunu iki yolla həll etməyə çalışın! Bir dəfə qruplarla, bir dəfə isə olmadan.)
naxış:
sətir:   <p> </span> <div> </kbd> <link> 
uyğun gəlir: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
qrup:    1 1111 111 111 1111    
( Qeyri-ələ keçirməyən qruplardan istifadə edən həll ) ( Qeyri-ələ keçirməyən qruplardan istifadə etmədən həll ) <h2>Addım 17: Geri bağlantılar \Nvə adlandırılmış tutma qrupları</h2> RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-3-cü hissəGirişdə sizi xəbərdar etmişəm ki, adətən normal ifadələrdən istifadə edərək HTML analizatoru yaratmağa çalışıram. ürək ağrısına gətirib çıxarır, bu sonuncu misal əksər müntəzəm ifadələrin başqa (bəzən) faydalı xüsusiyyətinə gözəl bir seguedir: geri istinadlar. Geri bağlantılar eyni mətni iki dəfə çəkməyə cəhd edə biləcəyiniz qrupları təkrarlamaq kimidir. Ancaq onlar bir vacib cəhətdə fərqlənirlər - onlar yalnız eyni mətni, xarakter xarakterini tutacaqlar. Təkrarlanan qrup bizə belə bir şey çəkməyə imkan verəcək:
naxış: (he(?:[az])+) 
sətir:   heyabcdefg hey heyo heyellow heyyyyyyyyy 
uyğun gəlir: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ 
qrup:    1111111111 111 1111 11111111 11111111111    
( Nümunə ) ...onda geri keçid yalnız bununla uyğunlaşacaq:
naxış: (he([az])(\2+)) 
sətir: heyabcdefg hey heyo heyellow heyyyyyyyyy 
uyğun gəlir:                              ^^^^^^^^^^^ 
qrup:                                 11233333333    
( Nümunə ) Təkrarlanan tutma qrupları eyni nümunəni təkrar-təkrar uyğunlaşdırmaq istədiyiniz zaman faydalıdır, halbuki siz eyni mətni uyğunlaşdırmaq istədiyiniz zaman geri bağlantılar yaxşıdır. Məsələn, uyğun açılış və bağlanan HTML teqlərini tapmaq üçün geri keçiddən istifadə edə bilərik:
naxış: <(\w+)[^>]*>[^<]+<\/\1> 
sətir:   <span style="color: red">hey</span> 
uyğun gəlir: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:    1111    
( Nümunə ) <mark>Qeyd edin</mark> ki, bu son dərəcə sadələşdirilmiş nümunədir və mən sizə müntəzəm ifadəyə əsaslanan HTML analizatoru yazmağa çalışmamağı tövsiyə edirəm. Bu, çox mürəkkəb sintaksisdir və çox güman ki, sizi xəstə edəcək. Adlandırılmış tutma qrupları geri bağlantılara çox bənzəyir, ona görə də mən onları burada qısaca əhatə edəcəyəm. Arxa istinadlar ilə adlandırılmış tutma qrupu arasındakı yeganə fərq ondan ibarətdir ki,... adlı tutma qrupunun adı var:
naxış: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
sətir:   <span style="color: red">hey< /span> 
uyğunluqlar: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:    1111    
( Nümunə ) Siz (?<name>...) və ya (?'name'...) sintaksisdən (.NET-ə uyğun müntəzəm ifadə) və ya bu sintaksisdən (?P<name>) istifadə edərək adlandırılmış tutma qrupu yarada bilərsiniz. ..) və ya (?P'name'...) (Python uyğun müntəzəm ifadə). Hər iki versiyanı dəstəkləyən PCRE (Perl Compatible Regular Expression) istifadə etdiyimiz üçün burada hər hansı birini istifadə edə bilərik. (Java 7 .NET sintaksisini kopyaladı, ancaq bucaqlı mötərizələr versiyası. Tərcüməçinin qeydi) Adlandırılmış tutma qrupunu daha sonra normal ifadədə təkrarlamaq üçün biz \<kname> və ya \k'name' (.NET) və ya (? P= ad) (Python). Yenə də PCRE bu müxtəlif variantların hamısını dəstəkləyir. Adlandırılmış tutma qrupları haqqında burada daha çox oxuya bilərsiniz , lakin onlar haqqında həqiqətən bilməli olduğunuz şeylərin əksəriyyəti bu idi. <h3>Bizə kömək etmək üçün tapşırıq:</h3> Mənə yadda saxlamaq üçün geri bağlantılardan istifadə edin... ummm... bu şəxsin adını.
naxış:
string: "Salam, mənim adım Joe." [sonra] "O oğlanın adı nədir? Joe ?"
matçlar:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
qrup:                  111    
( Həll ) <h2>Addım 18: irəliyə və arxaya baxın</h2> RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-4-cü hissəİndi biz müntəzəm ifadələrin bəzi inkişaf etmiş xüsusiyyətlərinə nəzər salacağıq. 16-cı addıma qədər olan hər şeyi tez-tez istifadə edirəm. Lakin bu son bir neçə addım yalnız çox mürəkkəb ifadələri uyğunlaşdırmaq üçün regexdən çox ciddi istifadə edən insanlar üçündür. Başqa sözlə, nizamlı ifadələrin ustaları. "İrəli Baxmaq" və "Geriyə Baxmaq" olduqca mürəkkəb görünə bilər, amma əslində çox da mürəkkəb deyillər. Onlar sizə əvvəllər tutmayan qruplarla etdiyimizə bənzər bir şey etməyə imkan verir - uyğunlaşdırmaq istədiyimiz faktiki mətndən dərhal əvvəl və ya dərhal sonra hər hansı mətnin olub olmadığını yoxlayın. Məsələn, fərz edək ki, biz yalnız insanların xoşuna gələn şeylərin adlarını uyğunlaşdırmaq istəyirik, ancaq onlar buna həvəslidirlərsə (yalnız cümləni nida işarəsi ilə bitirdikdə). Biz belə bir şey edə bilərik:
naxış: (\w+)(?=!) 
sətir: Mən masanı sevirəm. Mən stapleri yüksək qiymətləndirirəm. Mən lampanı sevirəm !
matçlar:                                           ^^^^ 
qrup:                                              1111    
( Nümunə(\w+) ) Siz adətən keçiddəki sözlərdən hər hansı birinə uyğun gələn yuxarıdakı tutma qrupunun yalnız lampa sözünə necə uyğun gəldiyini görə bilərsiniz . Müsbət irəliyə baxmaq (?=!)o deməkdir ki, biz yalnız bitən ardıcıllıqla uyğunlaşa bilərik, !lakin biz əslində nida işarəsi xarakterinin özünə uyğun gəlmirik. Bu mühüm fərqdir, çünki tutmayan qruplarla biz xarakterə uyğun gəlirik, lakin onu ələ keçirmirik. İrəli və arxaya baxışlarla normal ifadəmizi yaratmaq üçün bir xarakterdən istifadə edirik, lakin sonra onu hətta özünə qarşı uyğunlaşdırmırıq. Biz bunu daha sonra normal ifadəmizdə uyğunlaşdıra bilərik. İrəli və arxaya baxışın dörd növü var: müsbət irəliyə baxmaq (?=...), mənfi irəliyə baxmaq (?!...), müsbət irəliyə baxmaq (?<=...) və mənfi irəliyə baxmaq (?<!. ..) . Onlar səsləndiklərini edirlər - müsbət baxış və arxaya baxış müntəzəm ifadə mühərrikinə yalnız irəliyə/arxaya baxışda olan mətn həqiqətən uyğunlaşdıqda uyğunlaşmağa davam etməyə imkan verir. Mənfi irəliyə baxmaq və arxaya baxmaq əksini edir - onlar regexə yalnız irəliyə baxmaq/arxaya baxmaqda olan mətn uyğun gəlmədikdə uyğun gəlməyə imkan verir. Məsələn, biz metod adlarını onların işlədiyi obyektlə deyil, yalnız metod ardıcıllığı zəncirində uyğunlaşdırmaq istəyirik. Bu halda, hər bir metod adından əvvəl .. Sadə bir baxışdan istifadə edən müntəzəm ifadə burada kömək edə bilər:
nümunə: (?<=\.)(\w+) 
sətir: myArray. flatMap.aggregate.summarise.print !
matçlar:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:            1111111 111111111 111111111 11111    
( Nümunə ) Yuxarıdakı mətndə biz hər hansı bir söz simvolu ardıcıllığına uyğun gəlirik \w+, ancaq onlardan əvvəl simvol gələrsə .. Biz tutmayan qruplardan istifadə edərək oxşar bir şey əldə edə bilərik, lakin nəticə bir az daha qarışıqdır:
nümunə: (?:\.)(\w+) 
sətir: myArray .flatMap.aggregate.summarise.print !
matçlar:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
qrup:            1111111 111111111 111111111 11111    
( Nümunə ) Daha qısa olsa da, ehtiyacımız olmayan simvollara uyğun gəlir. Bu misal mənasız görünsə də, baxışlar və arxaya baxışlar adi ifadələrimizi təmizləməyə həqiqətən kömək edə bilər. <h3>Fişə çox az qalıb! Aşağıdakı 2 tapşırıq bizi buna 1 addım yaxınlaşdıracaq:</h3> Mənfi baxış (?<!...) normal ifadə mühərrikinə yalnız mənfi baxışın içərisində olan mətn olmadığı halda uyğunluq tapmağa davam etməyə imkan verir. mətnin qalan hissəsinə qədər göstərilir , onunla uyğunluq tapmaq lazımdır. Məsələn, biz yalnız konfransda iştirak edən qadınların soyadlarını uyğunlaşdırmaq üçün müntəzəm ifadədən istifadə edə bilərik. Bunun üçün biz əmin olmaq istərdik ki, şəxsin soyadından əvvəl hərf olmasın Mr.. Bunun üçün müntəzəm ifadə yaza bilərsinizmi? (Soyadların ən azı dörd simvoldan ibarət olduğu güman edilə bilər.)
naxış:
sim: cənab Braun, xanım. Smith , xanım Jones , Miss Daisy , Mr. Yaşıl
matçlar:                ^^^^^ ^^^^^ ^^^^^ 
qrup:                   11111 11111 11111    
( Həlli ) Tutaq ki, biz verilənlər bazasını təmizləyirik və bizdə faizləri təmsil edən məlumat sütunu var. Təəssüf ki, bəzi insanlar rəqəmləri [0.0, 1.0] diapazonunda onluq qiymətlər kimi yazdılar, digərləri isə [0.0%, 100.0%] diapazonunda faizlər yazdılar, digərləri isə faiz dəyərlərini yazdılar, lakin hərfi faiz işarəsini unutdular %. Mənfi baxışdan (?!...) istifadə edərək, yalnız faizlər olmalıdır, lakin rəqəmlər çatışmayan dəyərləri qeyd edə bilərsinizmi %? Bunlar 1.00-dən ciddi şəkildə böyük, lakin arxada olmayan dəyərlər olmalıdır %. (Heç bir ədəd ondalık nöqtədən əvvəl və ya sonra iki rəqəmdən çox ola bilməz.) <mark>Qeyd edin</mark> ki, bu həll olduqca çətindir . Əgər mənim cavabıma baxmadan bu problemi həll edə bilirsinizsə, deməli, siz artıq müntəzəm ifadələrdə böyük bacarıqlarınız var!
naxış:
sətir: 0,32 100,00 5,6 0,27 98% 12,2% 1,01 0,99% 0,99 13,13 1,10 
uyğunluq:      ^^^^^^ ^^^ ^^^^ ^^^^^ ^^^^ 
qrup:         111111 111 111111111    
( Həlli ) <h2>Addım 19: Normal İfadələrdəki Şərtlər</h2> RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-5-ci hissəİndi o yerə çatdıq ki, insanların çoxu daha normal ifadələrdən istifadə etməyəcək. Sadə normal ifadələr üçün istifadə hallarının 95%-ni əhatə etdik və 19 və 20-ci addımlarda görülən hər şey adətən awk və ya sed (və ya ümumi təyinatlı proqramlaşdırma dili) kimi daha tam funksiyalı mətn manipulyasiya dili ilə edilir. Yəni, davam edək ki, müntəzəm ifadənin həqiqətən nə edə biləcəyini biləsiniz. Normal ifadələr Turing tamamlanmasa da , bəzi müntəzəm ifadə mühərrikləri tam proqramlaşdırma dilinə çox oxşar xüsusiyyətlər təklif edir. Belə xüsusiyyətlərdən biri də “şərt”dir. Regex şərtləri if-then-else ifadələrinə imkan verir, burada seçilmiş budaq ya əvvəlki addımda öyrəndiyimiz "irəyə baxmaq" və ya "geriyə baxmaq" ilə müəyyən edilir. Məsələn, tarixlər siyahısında yalnız etibarlı qeydləri uyğunlaşdırmaq istəyə bilərsiniz:
nümunə: (?<=Fevral )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
sətir: İşlənmiş tarixlər : 28 fevral , 29 fevral , 30 fevral, 30 mart , 31 mart  
matçlar:                   ^^ ^^ ^^ ^^ 
qrup:                      11 11 22 22    
( Nümunə ) <mark>Qeyd edin</mark> yuxarıdakı qruplar da aylar üzrə indeksləşdirilir. Biz bütün 12 ay üçün müntəzəm ifadə yaza və yalnız etibarlı tarixləri tuta bilərdik, sonra bu tarixlər ilin ayına görə indeksləşdirilmiş qruplara birləşdiriləcək. Yuxarıda "Feb" rəqəmdən əvvəl gələrsə (və eyni şəkildə ikinci üçün) yalnız birinci qrupda uyğunluqları axtaracaq bir növ if-oxşar strukturdan istifadə edir. Bəs yalnız fevral ayı üçün xüsusi emaldan istifadə etmək istəsək nə olar? "Əgər nömrədən əvvəl "Feb" varsa, bunu edin, əks halda bu başqa şeyi edin." Şərtlər bunu necə edir:
nümunə: (?(?<=Fevral )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
sətir: İşlənmiş tarix: 28 fevral , 29 fevral , 30 fevral, 30 mart , 31 mart  
matçları:                   ^^ ^^ ^^ ^^ 
qrup:                      11 11 22 22    
( Misal ) if-then-else strukturu (?(If)then|else) kimi görünür, burada (əgər) "irə bax" və ya "geri bax" ilə əvəz olunur. Yuxarıdakı misalda (əgər) kimi yazılır (?<=Feb). 29-dan böyük tarixləri uyğunlaşdırdığımızı görə bilərsiniz, ancaq onlar "Fevral"a əməl etmədikdə. Şərti ifadələrdə arxadan baxma funksiyasından istifadə etmək, uyğunluğun əvvəlində bəzi mətnin olmasını təmin etmək istəyirsinizsə faydalıdır. Müsbət baxış şərtləri çaşdırıcı ola bilər, çünki şərtin özü heç bir mətnə ​​uyğun gəlmir. Beləliklə, əgər if şərtinin nə vaxtsa bir dəyəri olmasını istəyirsinizsə, o, aşağıdakı kimi qabaqcadan baxmaqla müqayisə oluna bilər:
naxış: (?(?=dəqiq)dəqiq|başqa)wo 
sətir: dəqiq başqa dəqiq iki başqa  
uyğunluq:            ^^^^^^^^^^^^^
( Nümunə ) Bu o deməkdir ki, müsbət baxış şərtləri faydasızdır. Siz həmin mətnin qarşısında olub-olmadığını yoxlayın və sonra onu izləmək üçün uyğun nümunə təqdim edin. Şərti ifadə burada bizə heç də kömək etmir. Siz həmçinin yuxarıdakıları daha sadə normal ifadə ilə əvəz edə bilərsiniz:
naxış: (?:dəqiq|başqa)iki 
sətir: dəqiq başqa dəqiq iki başqa  
uyğunluq:            ^^^^^^^ ^^^^^^
( Nümunə ) Beləliklə, şərti ifadələr üçün əsas qayda belədir: test et, test et və yenidən test et. Əks halda, aşkar hesab etdiyiniz həllər ən həyəcanlı və gözlənilməz şəkildə uğursuzluğa düçar olacaq :) <h3>Budur, bizi son, 20-ci addımdan ayıran son tapşırıqlar blokuna gəldik:</h3> Normal ifadə yazın. növbəti sözün böyük hərflə başlayıb-başlamadığını yoxlamaq üçün mənfi baxış şərti ifadəsindən istifadə edir. Əgər belədirsə, yalnız bir böyük hərf və sonra kiçik hərfləri götürün. Əgər belə deyilsə, hər hansı bir söz simvolunu götürün.
naxış:
simli:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
uyğunluqları: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Qrup:    22222 22222 11111 222222 111111111 222 111    
( Həllowns ) Mətni yalnız mətndən əvvəl deyilsə tutan cloudsyalnız mətndən əvvəl olanda mətni tutan şərti ifadənin arxasında mənfi baxış yazın cl. (Bir az uydurma nümunə, amma nə edə bilərsən...)
naxış:
simli: Bu klounların bəzi kl oudları var . udlar.
uyğunluqlar:              ^^^^ ^^^^   
( Həll ) <h2>Addım 20: Rekursiya və Əlavə Tədqiqat</h2> RegEx: Normal ifadələri mənimsəmək üçün 20 qısa addım.  4-6 hissəƏslində, hər hansı bir mövzuya 20 addımlıq girişə sıxışdırıla bilən çox şey var və müntəzəm ifadələr də istisna deyil. İnternetdə tapıla bilən müntəzəm ifadələr üçün çoxlu müxtəlif tətbiqlər və standartlar var . Əgər daha çox öyrənmək istəyirsinizsə, sizə gözəl düzenliexpressions.info saytına baxmağı təklif edirəm , bu, fantastik istinaddır və mən oradan normal ifadələr haqqında çox şey öyrəndim. Mən onu, eləcə də yaradıcılığınızı sınamaq və dərc etmək üçün regex101.com-u çox tövsiyə edirəm. Bu son addımda mən sizə müntəzəm ifadələr, yəni rekursiv ifadələrin necə yazılması haqqında bir az daha çox məlumat verəcəyəm. Sadə rekursiyalar olduqca sadədir, lakin gəlin bunun müntəzəm ifadə kontekstində nə demək olduğunu düşünək. Normal ifadədə sadə rekursiya üçün sintaksis(?R)? belə yazılır: . Amma təbii ki, bu sintaksis ifadənin özündə görünməlidir. Bizim edəcəyimiz ifadəni öz daxilində, ixtiyari sayda yuva qurmaqdır. Misal üçün:
model: (hey(?R)?oh) 
simli:   heyoh heyyoh heyheyohoh hey oh heyhey hey heyheyohoh  
uyğunluqlar: ^^^^^ ^^^^^^^^^^^^^^^^^^^^ 
qrup:    11111 1111111111 1111111111    
( Nümunə ) İç-içə ifadə isteğe bağlı olduğundan ( (?R)izlənilir ?), ən sadə uyğunluq rekursiyanı tamamilə rədd etməkdir. Beləliklə, hey, sonra ohuyğun gəlir ( heyoh). (?R)Bundan hər hansı daha mürəkkəb ifadəyə uyğun gəlmək üçün biz ardıcıllığı daxil etdiyimiz ifadənin nöqtəsində öz içinə uyğun gələn alt sətir tapmalıyıq . Başqa sözlə, heyheyohoh və ya heyheyohohoh tapa bilərdik və s. Bu iç-içə ifadələrin ən yaxşı cəhətlərindən biri odur ki, arxa istinadlardan və adlandırılmış tutma qruplarından fərqli olaraq, onlar sizi əvvəllər uyğunlaşdırdığınız dəqiq mətnlə, xarakterə görə məhdudlaşdırmırlar. Misal üçün:
naxış: ([Hh][Ee][Yy](?R)?oh) 
sətir:   heyoh heyyoh hEyHeYohoh hey oh heyhey hEyHeYHEyohohoh  
uyğun gəlir: ^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^ 
qrup:    11111 1111111111 111111111111111    
( Nümunə ) Təsəvvür edə bilərsiniz ki, nizamlı ifadə mühərriki sizin adi ifadənizi hərfi mənada ixtiyari sayda kopyalayıb özünə yapışdırır. Əlbəttə ki, bu o deməkdir ki, bəzən ümid etdiyinizi etməyə bilər:
nümunə: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
sətir: (* şərh (* iç içə *) deyil *)
matçlar:            ^^^^^^^^^^^^ 
qrup:               111111111111    
( Nümunə ) Siz deyə bilərsinizmi ki, niyə bu regex xarici şərhi deyil, yalnız iç-içə şərhi tutdu? Bir şey əmindir: mürəkkəb müntəzəm ifadələr yazarkən həmişə onları sınayın ki, onların düşündüyünüz kimi işlədiyinə əmin olun. Müntəzəm ifadələr yollarında bu yüksək sürətli yürüş başa çatdı. Ümid edirəm ki, bu səyahətdən zövq aldınız. Yaxşı, və nəhayət, əvvəlində söz verdiyim kimi, materialın daha dərindən öyrənilməsi üçün bir neçə faydalı linki buradan tərk edəcəyəm:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION