Különbség a Java Matcher keresés () és az egyezések () között

1. Áttekintés

Amikor a Java rendszeres kifejezéseivel dolgozunk, általában egy adott karakter karaktersorozatában akarunk keresni Minta. Ennek megkönnyítésére a Java Regular Expressions API biztosítja a Matcher osztály, amellyel egy adott reguláris kifejezést illeszthetünk egy szöveghez.

Általános szabály, hogy szinte mindig a két népszerű módszer egyikét akarjuk használni Matcher osztály:

  • megtalálja()
  • mérkőzések ()

Ebben a gyors bemutatóban egyszerű példakészlet segítségével megismerhetjük a módszerek közötti különbségeket.

2. A megtalálja() Módszer

Leegyszerűsítve: megtalálja() metódus megpróbálja megtalálni a regex minta előfordulását egy adott karaktersorozaton belül. Ha több előfordulás található a karakterláncban, akkor az első hívás a következőre: megtalálja() az első előfordulásra ugrik. Ezt követően minden következő hívás a megtalálja() A módszer egyenként megy a következő egyezésre.

Képzeljük el, hogy meg akarjuk keresni a megadott karakterláncot „Viszlát 2019 és üdvözlet 2020” csak négyjegyű számok esetén.

Ehhez a mintát fogjuk használni „\ d \ d \ d \ d” :

@Test public void whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("viszlát 2019-ig és üdvözlet 2020-ig"); 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 ()); }

Mivel ebben a példában két előfordulásunk van - 2019 és 2020 - a megtalálja() módszer visszatér igaz kétszer, és ha eléri a meccs régiójának végét, visszatér hamis.

Ha találunk egyezést, használhatunk olyan módszereket, mint Rajt(), csoport(), és vége () hogy további részleteket kapjon a meccsről, amint az fent látható.

A Rajt() módszer megadja a mérkőzés kezdő indexét, vége () visszaadja a karakter utolsó indexét a mérkőzés vége után, és csoport() visszaadja a mérkőzés tényleges értékét.

3. Az megtalálni (int) Módszer

Megtaláljuk a keresési módszer túlterhelt változatát is - megtalálni (int). Paraméterként veszi a startindexet és a kezdő indexet tekinti kiindulópontnak az események kereséséhez a karakterláncban.

Nézzük meg, hogyan kell használni ezt a módszert ugyanabban a példában, mint korábban:

@Test public void givenStartIndex_whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("viszlát 2019-ig és üdvözlet 2020-ig"); assertTrue (m.find (20)); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); }

Amint megadtuk a 20, láthatjuk, hogy most csak egyetlen előfordulást találtak - 2020, amely a várakozások szerint következik be ezen index után. És ahogy ez a helyzet megtalálja(), használhatunk olyan módszereket, mint Rajt(), csoport(), és vége () hogy további részleteket nyerjünk ki a meccsről.

4. A mérkőzések () Módszer

Másrészről, amérkőzések () metódus megpróbálja összehangolni az egész karakterláncot a mintával.

Ugyanezen példa esetén mérkőzések () vissza fog térni hamis:

@Test public void whenMatchFourDigitWorks_thenFail () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("viszlát 2019-ig és üdvözlet 2020-ig"); assertFalse (m.matches ()); } 

Ez azért van, mert megpróbál egyeztetni „\ d \ d \ d \ d” az egész húr ellenviszlát 2019 és üdvözlet 2020 ”ellentétben a megtalálja() és megtalálni (int) metódusok, amelyek mindkét esetben megtalálják a minta előfordulását a húron belül.

Ha a karakterláncot négyjegyűre változtatjuk “2019”, azután mérkőzések () vissza fog térni igaz:

@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 ()); }

Ahogy fentebb bemutattuk, használhatunk olyan módszereket is, mint Rajt(), csoport(), és vége () hogy további részleteket gyűjtsön a mérkőzésről. Egy érdekes szempont, hogy felhívjuk megtalálja() többször is eltérő kimenetet adhat vissza, miután meghívta ezeket a módszereket, amint azt az első példánkban láthattuk, de mérkőzések () mindig ugyanazt az értéket adja vissza.

5. Következtetés

Ebben a cikkben láttuk, hogyan megtalálja(), megtalálni (int), és mérkőzések () gyakorlati példával különböznek egymástól. Láttuk azt is, hogy a különféle módszerek milyenek Rajt(), csoport(), és vége () segíthet további részleteket kivonni az adott mérkőzésről.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.