Kako izbrojiti broj podudaranja za regularni izraz?

1. Pregled

Regularni izrazi mogu se koristiti za razne zadatke obrade teksta, poput algoritama za brojanje riječi ili provjeru unosa teksta.

U ovom uputstvu ćemo pogledati kako koristiti regularne izraze za prebroji broj podudaranja u nekom tekstu.

2. Slučaj upotrebe

Razradimo algoritam sposoban za brojeći koliko se puta valjana e-pošta pojavi u nizu.

Da bismo otkrili adresu e-pošte, upotrijebit ćemo jednostavan obrazac regularnog izraza:

([a-z0-9 _.-] +) @ ([a-z0-9 _.-] + [a-z])

Imajte na umu da je ovo trivijalni obrazac samo u demonstracijske svrhe, jer je stvarni regularni izraz za podudaranje valjanih adresa e-pošte prilično složen.

Trebat će nam ovaj regularni izraz unutar Uzorak objekt kako bismo ga mogli koristiti:

Uzorak EMAIL_ADDRESS_PATTERN = Uzorak.compile ("([[a-z0-9 _.-] +) @ ([a-z0-9 _.-] + [a-z])");

Osvrnut ćemo se na dva glavna pristupa, od kojih jedan ovisi o upotrebi Jave 9 ili novije.

Za naš primjer teksta pokušat ćemo pronaći tri e-adrese u nizu:

"Možete me kontaktirati putem [zaštićena e-poštom], [zaštićena e-poštom] i [zaštićena e-poštom]"

3. Brojanje podudaranja za Javu 8 i starije

Prvo, pogledajmo kako brojati podudaranja pomoću Jave 8 ili starije.

Jednostavan način brojanja utakmica je prelazak preko pronaći metoda Podudaranje razred. Ova metoda pokušava pronađite sljedeću podrednicu ulaznog niza koja odgovara uzorku:

Podudaranje countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher (TEXT_CONTAINING_EMAIL_ADDRESSES); broj brojeva = 0; while (countEmailMatcher.find ()) {count ++; }

Koristeći ovaj pristup, naći ćemo tri podudaranja, kako se i očekivalo:

assertEquals (3, count);

Imajte na umu da pronaći metoda ne resetira Podudaranje nakon svakog pronađenog podudaranja - nastavlja se s početkom u znaku nakon završetka prethodne podudarne sekvence, tako da ne bi uspjelo pronaći preklapajuće adrese e-pošte.

Na primjer, razmotrimo ovaj primjer:

String OVERLAPPING_EMAIL_ADDRESSES = "Pokušajte nas kontaktirati na [email protected] @ baeldung.com, [email protected]"; Podudaranje countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher (OVERLAPPING_EMAIL_ADDRESSES); broj brojeva = 0; while (countOverlappingEmailsMatcher.find ()) {count ++; } assertEquals (2, count);

Kada regularni izraz pokušava pronaći podudaranja u danom Niz, prvo će pronaći "[email protected]" kao podudaranje. Budući da nema dijela domene koji prethodi znaku @, marker se neće resetirati i drugi “@ Baeldung.com” bit će zanemareni. Nastavljajući dalje, smatrat će i "[zaštićen e-poštom]" kao drugo podudaranje:

Kao što je gore prikazano, imamo samo dva podudaranja u primjeru preklapajuće e-pošte.

4. Brojanje podudaranja za Javu 9 i novije verzije

Međutim, ako imamo dostupnu noviju verziju Jave, možemo koristiti rezultatima metoda Podudaranje razred. Ova metoda, dodana u Javi 9, vraća sekvencijalni tok rezultata podudaranja, što nam omogućuje lakše brojanje podudaranja:

dugo brojanje = countEmailMatcher.results () .count (); assertEquals (3, count);

Kao što smo vidjeli sa pronaći, Podudaranje se ne resetira tijekom obrade streama s rezultatima metoda. Slično tome, rezultatima metoda ne bi uspjela pronaći ni podudaranja koja se preklapaju.

5. Zaključak

U ovom kratkom članku naučili smo kako brojati podudaranja regularnog izraza.

Prvo smo naučili kako koristiti pronaći metoda s a dok petlja. Tada smo vidjeli kako nam nova metoda Java 9 streaming omogućuje to s manje koda.

Kao i uvijek, uzorci koda dostupni su na GitHubu.