Hogyan számolhatjuk meg a mérkőzések számát egy regex számára?

1. Áttekintés

A rendszeres kifejezéseket számos szövegfeldolgozási feladatra lehet használni, például szószámláló algoritmusokra vagy a szövegbevitel validálására.

Ebben az oktatóanyagban megvizsgáljuk, hogyan használjuk a reguláris kifejezéseket számolja meg a szövegben található egyezések számát.

2. Használjon esetet

Fejlesszünk ki egy erre képes algoritmust megszámolva, hogy egy érvényes e-mail hányszor jelenik meg egy karakterláncban.

Az e-mail cím észleléséhez egy egyszerű reguláris kifejezésmintát használunk:

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

Ne feledje, hogy ez triviális minta csak demonstrációs célokra, mivel az érvényes e-mail címek megfelelő regexe meglehetősen összetett.

Szükségünk lesz erre a reguláris kifejezésre a-ban Minta objektum, így használhatjuk:

Minta EMAIL_ADDRESS_PATTERN = Minta.fordítás ("([a-z0-9 _.-] +) @ ([a-z0-9 _.-] + [a-z])");

Két fő megközelítést vizsgálunk meg, amelyek közül az egyik a Java 9 vagy újabb verzióinak használatától függ.

Példaszövegünkként megpróbáljuk megtalálni a három e-mailt a karakterláncban:

"Léphet velem kapcsolatba az [email protected], [email protected] és [email protected] keresztül

3. Java 8 és régebbi mérkőzések számlálása

Először nézzük meg, hogyan lehet megszámolni a mérkőzéseket a Java 8 vagy annál régebbi verziójával.

A mérkőzések számlálásának egyszerű módja az iterálás a megtalálja módszere Matcher osztály. Ez a módszer megkísérli keresse meg a bemeneti szekvencia következő alsorát, amely megfelel a mintának:

Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher (TEXT_CONTAINING_EMAIL_ADDRESSES); int szám = 0; while (countEmailMatcher.find ()) {count ++; }

Ezzel a megközelítéssel három találatot találunk, a várakozásoknak megfelelően:

assertEquals (3, count);

Vegye figyelembe, hogy a megtalálja módszer nem állítja vissza a Matcher minden megtalált találat után - az előző sorozat egyezésének befejezése után kezdődik a karaktertől kezdődően, így nem működne egymással átfedő e-mail címek keresése.

Vegyük például ezt a példát:

String OVERLAPPING_EMAIL_ADDRESSES = "Próbáljon meg velünk kapcsolatba lépni az [email protected] @ baeldung.com, [email protected] címen"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher (OVERLAPPING_EMAIL_ADDRESSES); int szám = 0; while (countOverlappingEmailsMatcher.find ()) {count ++; } assertEquals (2, szám);

Amikor a regex megpróbálja megtalálni az adott találatokat Húr, először találja az „[email protected]” -t mint egyezést. Mivel a @ előtt nincs domainrész, a jelző nem lesz visszaállítva, a második pedig „@ Baeldung.com” figyelmen kívül hagyja. Továbbhaladva az „[email protected]” -t is a második mérkőzésnek tekinti:

Amint a fentiekből látható, az átfedő e-mail példában csak két találatunk van.

4. A mérkőzések számlálása Java 9 és újabb verziókhoz

Ha azonban a Java újabb verziója elérhető, használhatjuk a eredmények módszere Matcher osztály. Ez a Java 9-be felvett módszer a mérkőzések eredményeinek sorozatát adja vissza, lehetővé téve számunkra a mérkőzések egyszerűbb megszámlálását:

long count = countEmailMatcher.results () .szám (); assertEquals (3, count);

Mint ahogyan láttuk megtalálja, a Matcher nem áll vissza a fájl adatfolyamának feldolgozása közben eredmények módszer. Hasonlóképpen a eredmények a módszer sem működne az egymással átfedő mérkőzések megtalálásában.

5. Következtetés

Ebben a rövid cikkben megtanultuk, hogyan kell megszámolni a reguláris kifejezés egyezését.

Először megtanultuk a megtalálja módszer a míg hurok. Aztán láttuk, hogy az új Java 9 streaming módszer lehetővé teszi számunkra ezt kevesebb kóddal.

Mint mindig, a kódminták elérhetők a GitHubon.