Rozdiel medzi hľadaním Java Matcher () a zhodami ()

1. Prehľad

Pri práci s regulárnymi výrazmi v prostredí Java zvyčajne chceme vyhľadať postupnosť znakov pre daný výraz Vzor. Na uľahčenie toho poskytuje rozhranie Java Regular Expressions API rozhranie Matcher triedy, ktorú môžeme použiť na priradenie daného regulárneho výrazu k textu.

Spravidla takmer vždy budeme chcieť použiť jednu z dvoch populárnych metód Matcher trieda:

  • Nájsť()
  • zápasy()

V tejto rýchlej príručke sa dozvieme o rozdieloch medzi týmito metódami pomocou jednoduchej sady príkladov.

2. The Nájsť() Metóda

Zjednodušene povedané Nájsť() metóda sa snaží nájsť výskyt regexového vzoru v danom reťazci. Ak sa v reťazci nachádza viac výskytov, potom prvé volanie na Nájsť() preskočí na prvý výskyt. Potom každé ďalšie volanie na Nájsť() metóda prejde na ďalší zhodný výskyt, jeden po druhom.

Predstavme si, že chceme prehľadať zadaný reťazec „Dovidenia 2019 a vitajte 2020“ iba pre štvorciferné čísla.

Na tento účel použijeme vzor „\ d \ d \ d \ d“ :

@Test public void whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher („dovidenia 2019 a vitajte 2020“); assertTrue (m.find ()); assertEquals (8, m.start ()); assertEquals ("2019", m.group ()); assertEquals (12, m.end ()); assertTrue (m.find ()); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); assertFalse (m.find ()); }

Pretože v tomto príklade máme dva výskyty - 2019 a 2020 - the Nájsť() metóda sa vráti pravda dvakrát, a akonáhle dosiahne koniec oblasti zápasu, vráti sa nepravdivé.

Keď nájdeme ľubovoľnú zhodu, môžeme použiť metódy ako štart (), skupina ()a koniec() získať viac informácií o zápase, ako je uvedené vyššie.

The štart () metóda dá počiatočný index zápasu, koniec() vráti posledný index znaku po skončení zápasu a skupina () vráti skutočnú hodnotu zápasu.

3. The nájsť (int) Metóda

Máme tiež preťaženú verziu metódy hľadania - nájsť (int). Berie počiatočný index ako parameter a považuje začiatočný index za východiskový bod na hľadanie výskytov v reťazci.

Pozrime sa, ako použiť túto metódu v rovnakom príklade ako predtým:

@Test public void givenStartIndex_whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher („dovidenia 2019 a vitajte 2020“); assertTrue (m.find (20)); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); }

Ako sme uviedli počiatočný index vo výške 20, môžeme vidieť, že teraz sa našiel iba jeden výskyt - 2020, ku ktorému podľa očakávania dôjde po tomto indexe. A ako je to v prípade Nájsť(), môžeme použiť metódy ako štart (), skupina ()a koniec() na získanie ďalších podrobností o zápase.

4. The zápasy() Metóda

Na druhej strane, thezápasy() metóda sa snaží spojiť celý reťazec so vzorom.

Pre ten istý príklad zápasy() vráti sa nepravdivé:

@Test public void whenMatchFourDigitWorks_thenFail () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher („dovidenia 2019 a vitajte 2020“); assertFalse (m.matches ()); } 

Je to preto, že sa to pokúsi zhodiť „\ d \ d \ d \ d“ proti celej šnúre “dovidenia 2019 a vitajte 2020 ”na rozdiel od Nájsť() a nájsť (int) metódy, obe nájdu výskyt vzoru kdekoľvek v reťazci.

Ak zmeníme reťazec na štvorciferné číslo “2019”potom zápasy() vráti sa pravda:

@Test public void whenMatchFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("2019"); assertTrue (m.matches ()); assertEquals (0, m.start ()); assertEquals ("2019", m.group ()); assertEquals (4, m.end ()); assertTrue (m.matches ()); }

Ako je uvedené vyššie, môžeme použiť aj metódy ako štart (), skupina ()a koniec() zhromaždiť ďalšie podrobnosti o zápase. Jedným zaujímavým bodom, ktorý treba poznamenať, je volanie Nájsť() viackrát môže po vyvolaní týchto metód vrátiť iný výstup, ako sme videli v našom prvom príklade, ale zápasy() vráti vždy rovnakú hodnotu.

5. Záver

V tomto článku sme videli, ako na to Nájsť(), nájsť (int)a zápasy() sa navzájom líšia praktickým príkladom. Tiež sme videli, ako sa páčia rôzne metódy štart (), skupina ()a koniec() môže nám pomôcť získať viac podrobností o danom zápase.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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