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.