Razlika između Java Matcher find () i podudaranja ()

1. Pregled

Kada radimo s regularnim izrazima na Javi, obično želimo pretraživati ​​slijed znakova za zadani Uzorak. Da bi to olakšao, Java Regular Expressions API nudi Podudaranje klase koju možemo upotrijebiti za uparivanje određenog regularnog izraza s tekstom.

Kao opće pravilo, gotovo uvijek ćemo htjeti koristiti jednu od dvije popularne metode Podudaranje razred:

  • pronaći()
  • podudaranja ()

U ovom brzom vodiču naučit ćemo o razlikama između ovih metoda pomoću jednostavnog skupa primjera.

2. The pronaći() Metoda

Jednostavno rečeno, pronaći() metoda pokušava pronaći pojavu regularnog izraza unutar datog niza. Ako je u nizu pronađeno više pojavljivanja, tada je prvi poziv na pronaći() skočit će do prve pojave. Nakon toga, svaki sljedeći poziv na pronaći() metoda prijeći će na sljedeću pojavu podudaranja, jednu po jednu.

Zamislimo da želimo pretražiti navedeni niz “Zbogom 2019. i dobrodošli 2020.” samo za četveroznamenkaste brojeve.

Za ovo ćemo koristiti obrazac "\ d \ d \ d \ d" :

@Test public void whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("zbogom 2019. i dobrodošli 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 ()); }

Kako u ovom primjeru imamo dvije pojave - 2019 i 2020 - the pronaći() metoda će se vratiti pravi dva puta, a kad stigne do kraja regije meča, vratit će se lažno.

Jednom kad pronađemo bilo kakvo podudaranje, tada možemo koristiti metode poput početak(), skupina(), i kraj() kako biste saznali više detalja o utakmici, kao što je gore prikazano.

The početak() metoda će dati indeks početka meča, kraj() vratit će posljednji indeks lika nakon završetka meča i skupina() vratit će stvarnu vrijednost podudaranja.

3. The pronaći (int) Metoda

Imamo i preopterećenu verziju metode pronalaska - pronaći (int). Kao parametar uzima indeks starta i smatra početni indeks početnom točkom za traženje pojava u nizu.

Pogledajmo kako koristiti ovu metodu u istom primjeru kao i prije:

@Test javna praznina givenStartIndex_whenFindFourDigitWorks_thenCorrect () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("zbogom 2019. i dobrodošli 2020."); assertTrue (m.find (20)); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); }

Kao što smo osigurali početni indeks od 20, možemo vidjeti da je sada pronađena samo jedna pojava - 2020, što se događa očekivano nakon ovog indeksa. I, kao što je slučaj sa pronaći(), možemo koristiti metode poput početak(), skupina(), i kraj() kako biste izvukli više detalja o utakmici.

4. The podudaranja () Metoda

S druge strane, thepodudaranja () metoda pokušava uskladiti cijeli niz s uzorkom.

Za isti primjer, podudaranja () će se vratiti lažno:

@Test public void whenMatchFourDigitWorks_thenFail () {Pattern stringPattern = Pattern.compile ("\ d \ d \ d \ d"); Matcher m = stringPattern.matcher ("zbogom 2019. i dobrodošli 2020."); assertFalse (m.matches ()); } 

To je zato što će se pokušati podudarati "\ d \ d \ d \ d" protiv cijelog niza “zbogom 2019. i dobrodošli 2020. ”za razliku od pronaći() i pronaći (int) metode, obje će pronaći pojavu uzorka bilo gdje unutar niza.

Ako promijenimo niz u četveroznamenkasti broj “2019”, onda podudaranja () će se vratiti pravi:

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

Kao što je gore prikazano, također možemo koristiti metode poput početak(), skupina(), i kraj() kako biste prikupili više detalja o utakmici. Jedna zanimljiva stvar koju treba primijetiti je poziv pronaći() više puta može vratiti različite izlaze nakon pozivanja ovih metoda, kao što smo vidjeli u našem prvom primjeru, ali podudaranja () uvijek će vratiti istu vrijednost.

5. Zaključak

U ovom smo članku vidjeli kako pronaći(), pronaći (int), i podudaranja () međusobno se razlikuju praktičnim primjerom. Također smo vidjeli kako se sviđaju razne metode početak(), skupina(), i kraj() može nam pomoći izvući više detalja o datoj utakmici.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.