Bagaimana Mengira Bilangan Pertandingan untuk Regex?

1. Gambaran keseluruhan

Ungkapan biasa dapat digunakan untuk berbagai tugas pemrosesan teks, seperti algoritma penghitungan kata atau pengesahan input teks.

Dalam tutorial ini, kita akan melihat bagaimana menggunakan ungkapan biasa untuk menghitung jumlah padanan dalam beberapa teks .

2. Gunakan Kes

Mari kembangkan algoritma yang dapat mengira berapa kali e-mel yang sah muncul dalam rentetan .

Untuk mengesan alamat e-mel, kami akan menggunakan corak ungkapan biasa biasa:

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

Perhatikan bahawa ini adalah corak sepele untuk tujuan demonstrasi sahaja, kerana regex sebenar untuk memadankan alamat e-mel yang sah agak rumit.

Kami memerlukan ungkapan biasa ini di dalam objek Corak supaya kami dapat menggunakannya:

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

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

Untuk teks contoh kami, kami akan cuba mencari tiga e-mel dalam rentetan:

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

3. Menghitung Pertandingan untuk Java 8 dan Lebih Lama

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

Cara mudah untuk mengira perlawanan adalah dengan menggunakan kaedah mencari kelas Matcher . Kaedah ini cuba mencari urutan input seterusnya yang sesuai dengan corak :

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

Dengan menggunakan pendekatan ini, kami akan menemui tiga perlawanan, seperti yang diharapkan:

assertEquals(3, count);

Perhatikan bahawa kaedah cari tidak menetapkan semula Pencocokan setelah setiap pertandingan dijumpai - ia disambung semula bermula pada watak setelah akhir urutan sebelumnya dipadankan, jadi tidak akan berfungsi untuk mencari alamat e-mel yang bertindih.

Sebagai contoh, mari kita 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);

Apabila regex cuba mencari padanan dalam Rentetan yang diberikan , pertama ia akan menemukan "[dilindungi e-mel]" sebagai padanan. Oleh kerana tidak ada bahagian domain sebelum @, penanda tidak akan diset semula dan "@ baeldung.com" kedua akan diabaikan. Melanjutkan, ia juga akan menganggap "[dilindungi e-mel]" sebagai perlawanan kedua:

Seperti yang ditunjukkan di atas, kami hanya mempunyai dua perlawanan dalam contoh e-mel yang bertindih.

4. Menghitung Pertandingan untuk Java 9 dan Kemudian

Walau bagaimanapun, jika kita mempunyai versi yang lebih baru Jawa ada, kita boleh menggunakan keputusan kaedah yang Matcher kelas. Kaedah ini, yang ditambahkan di Java 9, mengembalikan aliran hasil pertandingan yang berurutan, yang memungkinkan kita menghitung pertandingan dengan lebih mudah:

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

Seperti yang kita lihat dengan find , yang Matcher tidak ditetap semula semasa memproses strim dari keputusan kaedah. Begitu juga, kaedah keputusan tidak berfungsi untuk mencari padanan yang bertindih.

5. Kesimpulan

Dalam artikel pendek ini, kami telah belajar bagaimana mengira padanan ungkapan biasa.

Pertama, kami belajar menggunakan kaedah cari dengan gelung sementara . Kemudian kami melihat bagaimana kaedah streaming Java 9 yang baru membolehkan kami melakukan ini dengan kurang kod.

Seperti biasa, sampel kod boleh didapati di GitHub.