Bagaimana Menghitung Jumlah Kecocokan untuk Regex?

1. Ikhtisar

Ekspresi reguler dapat digunakan untuk berbagai tugas pemrosesan teks, seperti algoritme penghitungan kata atau validasi input teks.

Dalam tutorial ini, kita akan melihat cara menggunakan ekspresi reguler untuk menghitung jumlah kecocokan di beberapa teks .

2. Kasus Penggunaan

Mari kembangkan algoritme yang mampu menghitung berapa kali email valid muncul dalam sebuah string .

Untuk mendeteksi alamat email, kami akan menggunakan pola ekspresi reguler sederhana:

([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])

Perhatikan bahwa ini adalah pola sepele untuk tujuan demonstrasi saja, karena regex sebenarnya untuk mencocokkan alamat email yang valid cukup rumit.

Kita membutuhkan ekspresi reguler ini di dalam objek Pattern sehingga kita bisa menggunakannya:

Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])");

Kita akan melihat dua pendekatan utama, salah satunya bergantung pada penggunaan Java 9 atau yang lebih baru.

Untuk teks contoh kami, kami akan mencoba menemukan tiga email dalam string:

"You can contact me through [email protected], [email protected], and [email protected]"

3. Menghitung Kecocokan untuk Java 8 dan Lebih Lama

Pertama, mari kita lihat cara menghitung pertandingan menggunakan Java 8 atau yang lebih lama.

Cara sederhana untuk menghitung kecocokan adalah dengan mengulang metode find dari kelas Matcher . Metode ini mencoba menemukan urutan masukan berikutnya yang cocok dengan pola :

Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher(TEXT_CONTAINING_EMAIL_ADDRESSES); int count = 0; while (countEmailMatcher.find()) { count++; }

Dengan menggunakan pendekatan ini, kita akan menemukan tiga kecocokan, seperti yang diharapkan:

assertEquals(3, count);

Perhatikan bahwa metode find tidak menyetel ulang Matcher setelah setiap kecocokan ditemukan - metode ini dilanjutkan mulai dari karakter setelah akhir dari urutan sebelumnya yang cocok, sehingga tidak akan berfungsi untuk menemukan alamat email yang tumpang tindih.

Misalnya, mari pertimbangkan contoh ini:

String OVERLAPPING_EMAIL_ADDRESSES = "Try to contact us at [email protected]@baeldung.com, [email protected]"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher(OVERLAPPING_EMAIL_ADDRESSES); int count = 0; while (countOverlappingEmailsMatcher.find()) { count++; } assertEquals(2, count);

Ketika regex mencoba menemukan kecocokan dalam String yang diberikan , pertama-tama regex akan menemukan “[email protected]” sebagai kecocokan. Karena tidak ada bagian domain sebelum @, penanda tidak akan disetel ulang dan "@ baeldung.com" yang kedua akan diabaikan. Selanjutnya, ini juga akan mempertimbangkan "[email dilindungi]" sebagai pencocokan kedua:

Seperti yang ditunjukkan di atas, kami hanya memiliki dua kecocokan dalam contoh email yang tumpang tindih.

4. Menghitung Pertandingan untuk Java 9 dan Nanti

Namun, jika kita memiliki versi yang lebih baru dari Java yang tersedia, kita dapat menggunakan hasil metode dari Matcher kelas. Metode ini, ditambahkan di Java 9, mengembalikan aliran hasil pertandingan yang berurutan, memungkinkan kita untuk menghitung pertandingan dengan lebih mudah:

long count = countEmailMatcher.results() .count(); assertEquals(3, count);

Seperti yang kita lihat dengan find , Matcher tidak diatur ulang saat memproses aliran dari metode hasil . Demikian pula, metode hasil tidak akan berfungsi untuk menemukan kecocokan yang tumpang tindih.

5. Kesimpulan

Dalam artikel singkat ini, kita telah mempelajari cara menghitung kecocokan ekspresi reguler.

Pertama, kita belajar bagaimana menggunakan metode find dengan loop sementara . Kemudian kami melihat bagaimana metode streaming Java 9 yang baru memungkinkan kami melakukan ini dengan lebih sedikit kode.

Seperti biasa, contoh kode tersedia di GitHub.