Forskjellen mellom Java Matcher find () og matches ()

1. Oversikt

Når vi jobber med vanlige uttrykk i Java, vil vi vanligvis søke i en tegnsekvens for en gitt Mønster. For å lette dette, tilbyr Java Regular Expressions API Matcher klasse, som vi kan bruke til å matche et gitt regulært uttrykk mot en tekst.

Som hovedregel vil vi nesten alltid bruke en av to populære metoder for Matcher klasse:

  • finne()
  • fyrstikker()

I denne raske opplæringen lærer vi om forskjellene mellom disse metodene ved hjelp av et enkelt sett med eksempler.

2. Den finne() Metode

Enkelt sagt, den finne() metoden prøver å finne forekomsten av et regex-mønster i en gitt streng. Hvis det blir funnet flere forekomster i strengen, blir den første samtalen til finne() vil hoppe til første forekomst. Deretter hver påfølgende samtale til finne() metoden vil gå til neste matchende forekomst, en etter en.

La oss forestille oss at vi vil søke i den angitte strengen “Farvel 2019 og velkommen 2020” kun for firesifrede tall.

For dette bruker vi mønsteret "\ d \ d \ d \ d" :

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

Siden vi har to forekomster i dette eksemplet - 2019 og 2020 - den finne() metoden vil komme tilbake ekte to ganger, og når den når slutten av kampregionen, kommer den tilbake falsk.

Når vi har funnet noe samsvar, kan vi bruke metoder som start(), gruppe(), og slutt() for å få mer informasjon om kampensom vist ovenfor.

De start() metoden vil gi startindeksen for kampen, slutt() vil returnere den siste indeksen av tegnet etter kampslutt, og gruppe() vil returnere den faktiske verdien av kampen.

3. Den finn (int) Metode

Vi har også den overbelastede versjonen av finn-metoden - finn (int). Det tar startindeksen som parameter og anser startindeksen som utgangspunkt for å lete etter forekomster i strengen.

La oss se hvordan du bruker denne metoden i samme eksempel som før:

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

Som vi har gitt en startindeks på 20, kan vi se at det nå bare er en forekomst funnet - 2020, som oppstår som forventet etter denne indeksen. Og som det er tilfellet med finne(), kan vi bruke metoder som start(), gruppe(), og slutt() for å trekke ut mer informasjon om kampen.

4. Den fyrstikker() Metode

På den andre siden, defyrstikker() metoden prøver å matche hele strengen mot mønsteret.

For det samme eksemplet, fyrstikker() vil returnere falsk:

@Test offentlig ugyldig nårMatchFourDigitWorks_thenFail () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("farvel 2019 og velkommen 2020"); assertFalse (m.matches ()); } 

Dette er fordi den vil prøve å matche "\ d \ d \ d \ d" mot hele strengen “farvel 2019 og velkommen 2020 ”i motsetning til finne() og finn (int) metoder, som begge vil finne forekomsten av mønsteret hvor som helst i strengen.

Hvis vi endrer strengen til firesifret nummer “2019”, deretter fyrstikker() vil returnere ekte:

@Test offentlig ugyldig nårMatchFourDigitWorks_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 ()); }

Som vist ovenfor kan vi også bruke metoder som start(), gruppe(), og slutt() for å samle mer detaljer om kampen. Et interessant poeng å merke seg er at det å ringe finne() flere ganger kan returnere forskjellig produksjon etter å ha kalt disse metodene, som vi så i vårt første eksempel, men fyrstikker() vil alltid returnere den samme verdien.

5. Konklusjon

I denne artikkelen har vi sett hvordan finne(), finn (int), og fyrstikker() skiller seg fra hverandre med et praktisk eksempel. Vi har også sett hvordan forskjellige metoder liker start(), gruppe(), og slutt() kan hjelpe oss med å hente ut mer informasjon om en gitt kamp.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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