Hvordan tæller antallet af matches til en Regex?

1. Oversigt

Regulære udtryk kan bruges til en række forskellige tekstbehandlingsopgaver, såsom ordtællingsalgoritmer eller validering af tekstinput.

I denne vejledning ser vi på, hvordan man bruger regulære udtryk til tæl antallet af matches i en eller anden tekst.

2. Brug sag

Lad os udvikle en algoritme, der er i stand til tæller hvor mange gange en gyldig e-mail vises i en streng.

For at opdage en e-mail-adresse bruger vi et simpelt mønster for regulært udtryk:

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

Bemærk, at dette kun er et trivielt mønster til demonstrationsformål, da den faktiske regex til at matche gyldige e-mail-adresser er ret kompleks.

Vi har brug for dette regelmæssige udtryk inde i en Mønster objekt, så vi kan bruge det:

Mønster EMAIL_ADDRESS_PATTERN = Mønster.kompil ("([a-z0-9 _.-] +) @ ([a-z0-9 _.-] + [a-z])");

Vi ser på to hovedtilgange, hvoraf den ene afhænger af brugen af ​​Java 9 eller nyere.

I vores eksempeltekst forsøger vi at finde de tre e-mails i strengen:

"Du kan kontakte mig via [email protected], [email protected] og [email protected]"

3. Tælle matches til Java 8 og ældre

Lad os først se, hvordan man tæller kampene ved hjælp af Java 8 eller ældre.

En enkel måde at tælle kampene på er at gentage over finde metode til Matcher klasse. Denne metode forsøger at find den næste sekvens af den indgangssekvens, der matcher mønsteret:

Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher (TEXT_CONTAINING_EMAIL_ADDRESSES); int-antal = 0; mens (countEmailMatcher.find ()) {count ++; }

Ved hjælp af denne tilgang finder vi som forventet tre kampe:

assertEquals (3, count);

Bemærk, at finde metoden nulstiller ikke Matcher efter hvert fundet match - det genoptages startende ved tegnet efter afslutningen af ​​den forrige matchede sekvens, så det fungerer ikke at finde overlappende e-mail-adresser.

Lad os for eksempel overveje dette eksempel:

String OVERLAPPING_EMAIL_ADDRESSES = "Prøv at kontakte os på [email protected] @ baeldung.com, [email protected]"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher (OVERLAPPING_EMAIL_ADDRESSES); int-antal = 0; mens (countOverlappingEmailsMatcher.find ()) {count ++; } assertEquals (2, count);

Når regex prøver at finde match i det givne Snor, først finder den “[email protected]” som en match. Da der ikke er nogen domænedel forud for @, bliver markøren ikke nulstillet og den anden “@ Baeldung.com” bliver ignoreret. Når vi fortsætter, vil det også overveje "[email protected]" som den anden kamp:

Som vist ovenfor har vi kun to kampe i det overlappende e-mail-eksempel.

4. Tælle matches til Java 9 og nyere

Men hvis vi har en nyere version af Java tilgængelig, kan vi bruge resultater metode til Matcher klasse. Denne metode, tilføjet i Java 9, returnerer en sekventiel strøm af matchresultater, der giver os mulighed for lettere at tælle kampene:

lang optælling = countEmailMatcher.results () .count (); assertEquals (3, count);

Som vi så med finde, det Matcher nulstilles ikke, mens strømmen behandles fra resultater metode. Tilsvarende er resultater Metoden fungerer heller ikke for at finde matches, der overlapper hinanden.

5. Konklusion

I denne korte artikel har vi lært, hvordan man tæller matchene i et regulært udtryk.

For det første lærte vi, hvordan man bruger finde metode med en mens løkke. Så så vi, hvordan den nye Java 9-streamingmetode giver os mulighed for at gøre dette med mindre kode.

Som altid er kodeeksemplerne tilgængelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found