Perbedaan Antara Java Matcher Find () dan Matcher ()

1. Ikhtisar

Saat bekerja dengan ekspresi reguler di Java, kami biasanya ingin mencari urutan karakter untuk Pola tertentu . Untuk memfasilitasi hal ini, Java Regular Expressions API menyediakan kelas Matcher , yang bisa kita gunakan untuk mencocokkan ekspresi reguler tertentu dengan teks.

Sebagai aturan umum, kita hampir selalu ingin menggunakan salah satu dari dua metode populer kelas Matcher :

  • Temukan()
  • pertandingan ()

Dalam tutorial singkat ini, kita akan belajar tentang perbedaan antara metode ini menggunakan sekumpulan contoh sederhana.

2. find () Method

Sederhananya, metode find () mencoba menemukan kemunculan pola regex dalam string tertentu . Jika beberapa kemunculan ditemukan dalam string, maka panggilan pertama ke find () akan melompat ke kemunculan pertama. Setelah itu, setiap panggilan berikutnya ke metode find () akan menuju ke kejadian pencocokan berikutnya, satu per satu.

Bayangkan kita ingin mencari string yang disediakan "selamat tinggal 2019 dan selamat datang tahun 2020" hanya untuk angka empat digit.

Untuk ini, kami akan menggunakan pola ā€œ\\ d \\ d \\ d \\ dā€ :

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

Karena kita memiliki dua kejadian dalam contoh ini - 2019 dan 2020 - metode find () akan mengembalikan nilai true dua kali, dan setelah mencapai akhir wilayah pertandingan, itu akan mengembalikan salah .

Setelah kami menemukan kecocokan, kami kemudian dapat menggunakan metode seperti start () , group () , dan end () untuk mendapatkan detail lebih lanjut tentang kecocokan , seperti yang ditunjukkan di atas.

Metode start () akan memberikan indeks awal pertandingan, end () akan mengembalikan indeks terakhir dari karakter setelah akhir pertandingan, dan group () akan mengembalikan nilai sebenarnya dari pertandingan tersebut .

3. find (int) Metode

Kami juga memiliki versi overload dari metode find - find (int) . Ini mengambil indeks awal sebagai parameter dan menganggap indeks awal sebagai titik awal untuk mencari kejadian dalam string .

Mari kita lihat cara menggunakan metode ini dalam contoh yang sama seperti sebelumnya:

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

Karena kami telah memberikan indeks awal 20 , kami dapat melihat bahwa sekarang hanya ada satu kejadian yang ditemukan - 2020, yang terjadi seperti yang diharapkan setelah indeks ini . Dan, seperti halnya dengan find () , kita bisa menggunakan metode seperti start () , group () , dan end () untuk mengekstrak lebih banyak detail tentang kecocokan.

4. pertandingan () Method

Di sisi lain, metode match () mencoba mencocokkan seluruh string dengan pola .

Untuk contoh yang sama, match () akan mengembalikan false :

@Test public void whenMatchFourDigitWorks_thenFail() { Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d"); Matcher m = stringPattern.matcher("goodbye 2019 and welcome 2020"); assertFalse(m.matches()); } 

Ini karena itu akan mencoba mencocokkan "\\ d \\ d \\ d \\ d" dengan seluruh string " selamat tinggal 2019 dan selamat datang 2020" - tidak seperti metode find () dan find (int) , keduanya akan temukan terjadinya pola di mana saja di dalam string .

Jika kita mengubah string menjadi empat digit angka "2019" , maka kecocokan () akan mengembalikan nilai true :

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

Seperti yang ditunjukkan di atas, kita juga bisa menggunakan metode seperti start () , group () , dan end () untuk mengumpulkan lebih banyak detail tentang pertandingan. Satu hal yang menarik untuk diperhatikan adalah bahwa memanggil find () beberapa kali dapat mengembalikan keluaran yang berbeda setelah memanggil metode ini, seperti yang kita lihat di contoh pertama kita, tetapi match () akan selalu mengembalikan nilai yang sama.

5. Kesimpulan

Dalam artikel ini, kita telah melihat bagaimana find () , find (int) , dan match () berbeda satu sama lain dengan contoh praktis. Kami juga telah melihat bagaimana berbagai metode seperti start () , group () , dan end () dapat membantu kami mengekstrak lebih banyak detail tentang kecocokan tertentu .

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.