JavaRush /Java Blogu /Random-AZ /Java-da müntəzəm ifadələrin əsasları. 3-cü hissə
articles
Səviyyə

Java-da müntəzəm ifadələrin əsasları. 3-cü hissə

Qrupda dərc edilmişdir
Gəlin müntəzəm ifadələrlə bağlı araşdırmamıza davam edək. Bu yazıda biz əvvəlcədən təyin edilmiş xarakter siniflərinə, eləcə də kəmiyyətləşdirməyə (ardıcıllıqların axtarışı) baxacağıq. Java-da müntəzəm ifadələrin əsasları.  Hissə 3 - 1

Əvvəlcədən təyin edilmiş xarakter sinifləri

Sinif API-də Patterntez-tez istifadə olunan müntəzəm ifadələr üçün rahat qısa yollar təklif edən əvvəlcədən təyin edilmiş simvol sinifləri var. Java-da müntəzəm ifadələrin əsasları.  3-2 hissəBu cədvəldə sol sütundakı konstruksiyalar sağ sütundakı ifadələrin qısa təsvirləridir. Məsələn, \drəqəm (0-9) deməkdir, \whər hansı böyük və ya kiçik hərf, alt xətt və ya rəqəm deməkdir. Mümkün olduqda əvvəlcədən təyin edilmiş xarakter siniflərindən istifadə edin. Bu, kodunuzu oxumağı və səhvləri düzəltməyi asanlaşdıracaq. Tərs kəsişmə ilə başlayan konstruksiyalar qaçış və ya qorunan adlanır. \QƏvvəlki məqalələrdə biz artıq əks xətlər və ya simvollarla xüsusi simvollardan qaçmaq və \Eonlardan adi simvol kimi istifadə etmək barədə danışmışıq . Əgər siz adi simvollarla (hərfi) tərs xətt istifadə edirsinizsə, onda ifadənin tərtib edilməsi üçün tərs xəttdən qaçmalısınız.
private final String REGEX = "\\d"; // цифра
Bu nümunədə \dmüntəzəm ifadə; proqramın kompilyasiyası üçün əlavə tərs xətt lazımdır. Test proqramımız müntəzəm ifadələri birbaşa konsoldan oxuyur, ona görə də əlavə slash tələb olunmur. Aşağıdakı misal əvvəlcədən təyin edilmiş simvol siniflərinin istifadəsini nümayiş etdirir: Java-da müntəzəm ifadələrin əsasları.  3-3-cü hissəJava-da müntəzəm ifadələrin əsasları.  3-4-cü hissəİlk üç misalda müntəzəm ifadə sadəcə olaraq " ." (nöqtə xüsusi simvolu) hər hansı simvol deməkdir. Ona görə də axtarış bütün hallarda uğurlu alınıb. Digər nümunələrdə yuxarıdakı cədvəldə mənalarını müzakirə etdiyimiz əvvəlcədən təyin edilmiş simvol siniflərindən istifadə olunur.

Kəmiyyət göstəriciləri

Java-da müntəzəm ifadələrin əsasları.  3-4-cü hissəMiqdarlar sətirdə simvolun baş vermə sayını təyin etməyə imkan verir. Gəlin acgöz, tənbəl və çox acgöz kəmiyyət göstəricilərinin necə işlədiyinin incəliklərinə daha yaxından nəzər salaq. İlk baxışdan elə görünə bilər ki, X?, X?? və X?+ eyni şəkildə işləyir: “X bir dəfə mövcuddur və ya ümumiyyətlə yoxdur.” Aşağıda nəzərdən keçirəcəyimiz bu kəmiyyət göstəricilərinin həyata keçirilməsində kiçik fərqlər var.

Sıfır uzunluq uyğun gəlir

Gəlin acgözdən başlayaq. Gəlin üç fərqli normal ifadə yazaq: xüsusi simvollarla “a” hərfi ?, * və ya +. Görək bu müntəzəm ifadələri boş sətirdə yoxlasaq nə olacaq: Java-da müntəzəm ifadələrin əsasları.  3-5-ci hissəYuxarıdakı misalda ilk iki halda axtarış uğurlu alındı, çünki a? və a* a simvolunun sətirdə əskik olmasına icazə verir. Həmçinin nəzərə alın ki, başlanğıc və son uyğunluq indeksi eynidir (0). Giriş sətirinin uzunluğu olmadığı üçün proqram birinci mövqedə heç nə tapmır :). Bu hal sıfır uzunluqlu uyğunluq adlanır. Belə uyğunluqlar bir neçə halda baş verir: giriş sətri boş olduqda, giriş xəttinin əvvəlində, sətrin sonuncu simvolundan sonra və ya sətirdəki simvollar arasında. Sıfır uzunluqlu matçları tapmaq asandır: onlar eyni mövqedə başlayır və bitir. Sıfır uzunluqlu uyğunluqların daha bir neçə nümunəsinə baxaq. Gəlin daha bir neçə nümunə ilə sıfır uzunluqlu uyğunluqları araşdıraq. Gəlin giriş sətirini “a” simvoluna dəyişdirək və maraqlı effekti müşahidə edək: Java-da müntəzəm ifadələrin əsasları.  3-6 hissəHər üç kəmiyyət göstəricisi “a” simvolunu tapdı, lakin simvolun olmamasına imkan verən ilk ikisi 1-ci mövqedə sıfır uzunluqlu uyğunluq tapdı. - sətrin son simvolundan sonra. Bu, proqramın “a” simvolunu sətir kimi qəbul etməsi və daha uyğunluq qalmayana qədər onun üzərindən “çalışması” ilə əlaqədar baş verir. İstifadə olunan kəmiyyət göstəricisindən asılı olaraq proqram sətirin sonunda “heç nə” tapacaq və ya tapmayacaq. İndi daxiletmə sətirini beş hərfdən ibarət “a” ardıcıllığına dəyişdirək: Java-da müntəzəm ifadələrin əsasları.  3-7 hissəNormal ifadə a? sətirdəki hər hərf üçün ayrıca uyğunluq tapır. a* ifadəsi iki uyğunluq tapır: simvol ardıcıllığı "a"' və 5-ci mövqedə sıfır uzunluqlu uyğunluq. Və nəhayət, a+ müntəzəm ifadəsi “heç nə” tapmadan yalnız “a” simvol ardıcıllığını tapır :) Müxtəlif simvollardan ibarət sətir giriş kimi verilsə nə baş verəcək? Məsələn, "ababaaaab": Java-da müntəzəm ifadələrin əsasları.  3-8 hissə"b" simvolu 1, 3 və 8 mövqelərindədir və proqram bu mövqelərdə sıfır uzunluqlu uyğunluqlar tapır. Daimi ifadə a? “b”yə diqqət yetirmir, sadəcə olaraq “a” simvolunun varlığını (yaxud yoxluğunu) axtarır. Əgər kəmiyyət göstəricisi "a"nın olmamasına icazə verirsə, sətirdə "a"-dan başqa bütün simvollar sıfır uzunluqlu uyğunluq kimi göstəriləcək. Verilmiş uzunluqdakı ardıcıllığı tapmaq üçün sadəcə olaraq uzunluğu əyri mötərizələrdə göstərin: Java-da müntəzəm ifadələrin əsasları.  3-9-cu hissəa{3} müntəzəm ifadəsi üç "a" simvolunun ardıcıllığını axtarır. Birinci sətirdə heç nə tapılmadı, çünki sətirdə kifayət qədər a yoxdur. İkincisi proqramın tapdığı 3 simvoldan ibarətdir. Üçüncü test də sətirin əvvəlində uyğunluq tapır. 3-cü simvoldan sonrakı hər şey normal ifadəni qane etmir, aşağıdakı kodda bunu təmin edir və bir neçə uyğunluq olacaq: Java-da müntəzəm ifadələrin əsasları.  3-10-cu hissəMinimum ardıcıllığın uzunluğunu təyin etmək üçün istifadə edin:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Bu misalda proqram yalnız bir uyğunluq tapır, çünki sətir (3) "a" simvolunun minimum ardıcıllıq uzunluğu tələbinə cavab verir. Nəhayət, maksimum ardıcıllıq uzunluğunu təyin edin: Java-da müntəzəm ifadələrin əsasları.  Hissə 3 - 11Bu nümunədə ilk uyğunluq altıncı simvolda bitdi. İkinci matçda altıncıdan sonrakı simvollar var, çünki onlar minimum uzunluq tələbini ödəyirlər. Sətir bir simvol qısa olsaydı, ikinci uyğunluq olmazdı.

Xarakter qruplarından və kəmiyyət göstəriciləri ilə siniflərdən istifadə

Bu nöqtəyə qədər biz eyni simvolu ehtiva edən sətirlərdə kəmiyyət göstəricilərini sınaqdan keçirdik. Kəmiyyət göstəriciləri yalnız bir simvol üçün tətbiq olunur, buna görə də "abc+" müntəzəm ifadəsi "ab" və "c" olan sətirlərə bir və ya bir neçə dəfə uyğun olacaq. Bu, bir və ya bir neçə dəfə "abc" demək olmayacaq. Lakin kəmiyyət göstəriciləri [abc]+ (a və ya b və ya c, bir və ya bir neçə dəfə) və ya (abc)+ (“abc” bir və ya bir neçə dəfə) kimi qruplar və simvol sinifləri ilə birlikdə istifadə edilə bilər. Bir sətirdə üç dəfə bir qrup simvol (it) tapaq: Java-da müntəzəm ifadələrin əsasları.  Hissə 3 - 12Birinci misalda proqram uyğunluğu tapır, çünki kəmiyyət göstəricisi simvollar qrupuna qədər uzanır. Mötərizələri çıxarsanız, {3} kəmiyyət göstəricisi yalnız “g” hərfinə tətbiq olunacaq. Siz həmçinin simvol sinifləri olan kəmiyyət göstəricilərindən istifadə edə bilərsiniz: Основы регулярных выражений в Java. Часть 3 - 13{3} kəmiyyət göstəricisi birinci misalda mötərizədə olan simvol sinfinə, ikincidə isə yalnız “c” simvoluna aiddir.

Acgöz, tənbəl və həddindən artıq acgöz kəmiyyətlər arasındakı fərqlər

Acgöz, istəksiz və sahiblik kəmiyyətləri arasında cüzi fərqlər var. Acgöz kəmiyyət göstəriciləri mümkün olan ən uzun uyğunluğu tapmağa çalışdıqları üçün belə adlandırılmışdır: proqram əvvəlcə bütün sətiri "yeməyə" çalışır, uyğunluq tapılmazsa, bir simvol atılır və uyğunluq tapılana və ya axtarış təkrarlanana qədər təkrarlanır. daha simvol qalmayıb. Tənbəllər isə sətirin əvvəlindən başlayır, uyğun gələnə qədər xarakter ardınca xarakter əlavə edirlər. Nəhayət, qısqanc kəmiyyət göstəriciləri tamahkarlıqda olduğu kimi simvolları silmədən bütün sətiri bir dəfə skan edir. Nümayiş üçün xfooxxxxxxfoo sətirindən istifadə edəcəyik. Основы регулярных выражений в Java. Часть 3 - 14Birinci misal hər hansı simvolu tapmaq üçün 0 və ya daha çox dəfə, ardınca "f" "o" "o" simvollarını tapmaq üçün acgöz .* kəmiyyət göstəricisindən istifadə edir. Cantifier acgöz olduğundan, tapılan uyğunluq bütün simli ehtiva edir. Acgöz kəmiyyət göstəricisi sətirdə bütün uyğunluqları tapmayacaq, çünki ilk addımda bütün sətri skan etdikdən sonra uyğunluğu tapacaq və işi bitirəcək. İkinci misal tənbəldir və sətirin əvvəlindən başlayır, simvol-xarakter əlavə edir. Proqram "boşluğu" yoxlamaqla başlayır, lakin o vaxtdan bəri "foo" ardıcıllığı sətrin əvvəlində deyil, axtarış "x" simvolunun əlavə edilməsi ilə davam edir, bundan sonra ilk uyğunluq 0 və 4 indeksləri arasında tapılacaq. Axtarış xəttin sonuna qədər davam edir ikinci uyğunluq isə 4 və 13 indeksləri arasında tapılacaq. Üçüncü misalda kəmiyyət göstəricisi qısqanc olduğu üçün təsadüflər tapılmır. Bu halda, .*+ müntəzəm ifadəsi bütün sətri "yedi" və "foo" üçün heç bir şey qoymur. Sətirdə lazımsız hər hansı bir şeyi atmaq lazım olduqda qısqanc kəmiyyət göstəricisindən istifadə edin, bu, ekvivalent acgöz kəmiyyət göstəricisindən daha təsirli olacaq. Hamısı budur! Mənbəyə keçid: Java-da müntəzəm ifadələrin əsasları. 3-cü hissə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION