Forskellen mellem Java Matcher find () og matches ()

1. Oversigt

Når vi arbejder med regulære udtryk i Java, vil vi typisk søge i en tegnsekvens efter en given Mønster. For at lette dette giver Java Regular Expressions API den Matcher klasse, som vi kan bruge til at matche et givet regulært udtryk mod en tekst.

Som hovedregel vil vi næsten altid bruge en af ​​to populære metoder til Matcher klasse:

  • finde()
  • Tændstikker()

I denne hurtige vejledning lærer vi forskellene mellem disse metoder ved hjælp af et simpelt sæt eksempler.

2. Den finde() Metode

Enkelt sagt, den finde() metoden forsøger at finde forekomsten af ​​et regex-mønster inden for en given streng. Hvis der findes flere forekomster i strengen, kaldes det første til finde() springer til den første forekomst. Derefter hvert efterfølgende opkald til finde() metode går til den næste matchende forekomst, en efter en.

Lad os forestille os, at vi vil søge i den medfølgende streng “Farvel 2019 og velkommen 2020” kun til firecifrede tal.

Til dette bruger vi mønsteret “\ d \ d \ d \ d” :

@Test offentligt ugyldigt nårFindFourDigitWorks_thenCorrect () {MønsterstrengPattern = Mønster.kompil ("\ 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 ()); }

Da vi har to forekomster i dette eksempel - 2019 og 2020 - det finde() metoden vender tilbage rigtigt to gange, og når den når slutningen af ​​kampregionen, vender den tilbage falsk.

Når vi finder et match, kan vi derefter bruge metoder som Start(), gruppe()og ende() for at få flere detaljer om kampensom vist ovenfor.

Det Start() metoden giver startindekset for kampen, ende() vil returnere det sidste indeks for tegnet efter kampens afslutning, og gruppe() returnerer kampens faktiske værdi.

3. Den find (int) Metode

Vi har også den overbelastede version af find-metoden - find (int). Det tager startindekset som parameter og betragter startindekset som udgangspunkt for at lede efter forekomster i strengen.

Lad os se, hvordan man bruger denne metode i samme eksempel som før:

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

Da vi har leveret et startindeks på 20, kan vi se, at der nu kun er én forekomst fundet - 2020, som forekommer som forventet efter dette indeks. Og som det er tilfældet med finde(), kan vi bruge metoder som Start(), gruppe()og ende() for at udtrække flere detaljer om kampen.

4. Den Tændstikker() Metode

På den anden side, detTændstikker() metoden forsøger at matche hele strengen mod mønsteret.

For det samme eksempel Tændstikker() kommer tilbage falsk:

@Test offentlig ugyldigt nårMatchFourDigitWorks_thenFail () {MønsterstrengPattern = Mønster.kompil ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("farvel 2019 og velkommen 2020"); assertFalse (m.matches ()); } 

Dette er fordi det vil prøve at matche “\ d \ d \ d \ d” mod hele strengen “farvel 2019 og velkommen 2020 ”i modsætning til finde() og find (int) metoder, som begge finder forekomsten af ​​mønsteret overalt i strengen.

Hvis vi ændrer strengen til det firecifrede tal “2019”, derefter Tændstikker() kommer tilbage rigtigt:

@Test offentlig ugyldig nårMatchFourDigitWorks_thenCorrect () {MønsterstrengPattern = Mønster.kompil ("\ 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å bruge metoder som Start(), gruppe()og ende() for at samle flere detaljer om kampen. Et interessant punkt at bemærke er at kalde finde() flere gange kan returnere forskellige output efter at have kaldt disse metoder, som vi så i vores første eksempel, men Tændstikker() returnerer altid den samme værdi.

5. Konklusion

I denne artikel har vi set hvordan finde(), find (int)og Tændstikker() adskiller sig fra hinanden med et praktisk eksempel. Vi har også set, hvordan forskellige metoder kan lide Start(), gruppe()og ende() kan hjælpe os med at udtrække flere detaljer om et givet match.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.