Ako počítať počet zhôd pre regulárny výraz?

1. Prehľad

Regulárne výrazy možno použiť na rôzne úlohy spracovania textu, ako sú napríklad algoritmy počítania slov alebo validácia textových vstupov.

V tomto výučbe sa pozrieme na to, ako používať regulárne výrazy na spočítať počet zápasov v nejakom texte.

2. Prípad použitia

Poďme vyvinúť algoritmus schopný spočítava, koľkokrát sa platný e-mail objaví v reťazci.

Na zistenie e-mailovej adresy použijeme jednoduchý vzor regulárneho výrazu:

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

Upozorňujeme, že toto je triviálny vzor iba na demonštračné účely, pretože skutočný regulárny výraz pre porovnávanie platných e-mailových adries je dosť zložitý.

Tento regulárny výraz budeme potrebovať vo vnútri a Vzor objekt, aby sme ho mohli použiť:

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

Pozrime sa na dva hlavné prístupy, z ktorých jeden závisí od používania Java 9 alebo novšej.

Pre náš ukážkový text sa pokúsime nájsť tri e-maily v reťazci:

„Môžete ma kontaktovať prostredníctvom [e-mail chránený], [e-mail chránený] a [e-mail chránený]“

3. Počítanie zhôd pre Java 8 a staršie

Najprv sa pozrime, ako počítať zápasy pomocou Java 8 alebo staršej.

Jednoduchým spôsobom počítania zápasov je opakovanie Nájsť metóda Matcher trieda. Táto metóda sa pokúša vyhľadajte nasledujúcu sekvenciu vstupnej sekvencie, ktorá sa zhoduje so vzorom:

Counter countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher (TEXT_CONTAINING_EMAIL_ADDRESSES); počet int = 0; while (countEmailMatcher.find ()) {count ++; }

Pomocou tohto prístupu nájdeme podľa očakávania tri zhody:

assertEquals (3; pocet);

Všimnite si, že Nájsť metóda nevynuluje Matcher po každej nájdenej zhode - obnovuje sa počnúc znakom po konci predchádzajúcej zhodnej sekvencie, takže by nefungovalo hľadanie prekrývajúcich sa e-mailových adries.

Uvažujme napríklad o tomto príklade:

Reťazec OVERLAPPING_EMAIL_ADDRESSES = "Pokúste sa nás kontaktovať na [e-mail chránený] @ baeldung.com, [e-mail chránený]"; Counter countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher (OVERLAPPING_EMAIL_ADDRESSES); počet int = 0; while (countOverlappingEmailsMatcher.find ()) {count ++; } assertEquals (2; pocet);

Keď sa regex pokúsi nájsť zhody v danom Reťazec, najskôr sa nájde zhoda „[chránený e-mailom]“. Pretože pred znakom @ nie je žiadna doménová časť, značka sa resetovať nebude a druhá „@ Baeldung.com“ bude ignorovaný. Ďalej budeme považovať „[chránený e-mailom]“ za druhú zhodu:

Ako je uvedené vyššie, v príklade prekrývajúceho sa e-mailu máme iba dve zhody.

4. Počítanie zhôd pre Java 9 a novšie

Ak však máme k dispozícii novšiu verziu Java, môžeme použiť výsledky metóda Matcher trieda. Táto metóda pridaná do Java 9 vracia sekvenčný prúd výsledkov zhody, čo nám umožňuje ľahšie počítať zhody:

long count = countEmailMatcher.results () .count (); assertEquals (3; pocet);

Ako sme videli s Nájsť, Matcher sa počas spracovania streamu z výsledky metóda. Podobne výsledky metóda by tiež nefungovala pri hľadaní zhôd, ktoré sa prekrývajú.

5. Záver

V tomto krátkom článku sme sa naučili, ako počítať zhody regulárneho výrazu.

Najprv sme sa naučili, ako používať Nájsť metóda s a zatiaľ čo slučka. Potom sme videli, ako nám to umožňuje nová metóda streamovania Java 9 s menším počtom kódov.

Vzorky kódu sú ako vždy k dispozícii na GitHub.


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