Verschil tussen Java Matcher find () en matches ()

1. Overzicht

Wanneer we met reguliere expressies in Java werken, willen we meestal een tekenreeks doorzoeken op een gegeven Patroon. Om dit mogelijk te maken, biedt de Java Regular Expressions API de Matcher class, die we kunnen gebruiken om een ​​bepaalde reguliere expressie te vergelijken met een tekst.

Als algemene regel zullen we bijna altijd een van de twee populaire methoden van de Matcher klasse:

  • vind()
  • wedstrijden()

In deze korte tutorial leren we over de verschillen tussen deze methoden aan de hand van een eenvoudige reeks voorbeelden.

2. Het vind() Methode

Simpel gezegd, de vind() methode probeert het voorkomen van een regex-patroon binnen een bepaalde string te vinden. Als er meerdere exemplaren in de tekenreeks worden gevonden, wordt de eerste aanroep naar vind() zal naar de eerste keer springen. Daarna wordt elke volgende oproep aan de vind() methode gaat één voor één naar de volgende overeenkomende instantie.

Laten we ons voorstellen dat we de opgegeven string willen doorzoeken “Tot ziens 2019 en welkom 2020” alleen voor viercijferige nummers.

Hiervoor gebruiken we het patroon "\ d \ d \ d \ d" :

@Test public void whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("tot ziens 2019 en welkom 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 ()); }

Omdat we in dit voorbeeld twee keer voorkomen - 2019 en 2020 - de vind() methode zal terugkeren waar tweemaal, en zodra het het einde van de wedstrijdregio bereikt, keert het terug false.

Zodra we een overeenkomst hebben gevonden, kunnen we methoden gebruiken zoals begin(), groep(), en einde() voor meer details over de wedstrijd, zoals hierboven getoond.

De begin() methode geeft de startindex van de wedstrijd, einde() retourneert de laatste index van het teken na het einde van de overeenkomst, en groep() retourneert de werkelijke waarde van de overeenkomst.

3. Het vind (int) Methode

We hebben ook de overbelaste versie van de zoekmethode - vind (int). Het neemt de startindex als parameter en beschouwt de startindex als het startpunt om naar occurrences in de string te zoeken.

Laten we eens kijken hoe we deze methode in hetzelfde voorbeeld als hiervoor kunnen gebruiken:

@Test openbare ongeldig gegevenStartIndex_whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("tot ziens 2019 en welkom 2020"); assertTrue (m.find (20)); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); }

Zoals we hebben verstrekt een startindex van 20kunnen we zien dat er nu maar één exemplaar is gevonden - 2020, wat gebeurt zoals verwacht na deze index. En, zoals het geval is met vind()kunnen we methoden gebruiken zoals begin(), groep(), en einde() om meer details over de wedstrijd te extraheren.

4. Het wedstrijden() Methode

Aan de andere kant, dewedstrijden() methode probeert de hele string te matchen met het patroon.

Voor hetzelfde voorbeeld, wedstrijden() zal terugkeren false:

@Test public void whenMatchFourDigitWorks_thenFail () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("tot ziens 2019 en welkom 2020"); assertFalse (m.matches ()); } 

Dit komt omdat het zal proberen te matchen "\ d \ d \ d \ d" tegen de hele string "tot ziens 2019 en welkom 2020 ”in tegenstelling tot de vind() en vind (int) methoden, die beide het voorkomen van het patroon overal in de string zullen vinden.

Als we de string veranderen in het viercijferige nummer “2019”, dan wedstrijden() zal terugkeren waar:

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

Zoals hierboven getoond, kunnen we ook methoden gebruiken zoals begin(), groep(), en einde() om meer details over de wedstrijd te verzamelen. Een interessant punt om op te merken is dat bellen vind() meerdere keren kunnen verschillende uitvoer retourneren na het aanroepen van deze methoden, zoals we in ons eerste voorbeeld zagen, maar wedstrijden() retourneert altijd dezelfde waarde.

5. Conclusie

In dit artikel hebben we gezien hoe vind(), vind (int), en wedstrijden() verschillen van elkaar met een praktisch voorbeeld. We hebben ook gezien hoe verschillende methoden eruit zien begin(), groep(), en einde() kan ons helpen meer details over een bepaalde match te extraheren.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.