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.
Əvvəlcədən təyin edilmiş xarakter sinifləri
Sinif API-dəPattern
tez-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. Bu cədvəldə sol sütundakı konstruksiyalar sağ sütundakı ifadələrin qısa təsvirləridir. Məsələn, \d
rəqəm (0-9) deməkdir, \w
hə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ə \E
onlardan 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ə \d
mü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: İ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
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: 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: 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: 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": "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: 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: 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: Bu 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ı.
GO TO FULL VERSION