String.matches() Regex Anomaly: Membongkar Kesalahan Regex Tersembunyi
Dalam pengaturcaraan Java, kaedah String.matches() kelihatan seperti cara intuitif untuk mengesahkan rentetan terhadap ungkapan biasa. Walau bagaimanapun, tingkah lakunya boleh mengelirukan, terutamanya jika dibandingkan dengan bahasa pengaturcaraan lain.
Pertimbangkan coretan kod berikut:
String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[a-z]")) { System.out.println(s); } }
Kod ini bertujuan untuk mencetak hanya rentetan "dkoe" sejak ia hanya mengandungi aksara abjad kecil. Walau bagaimanapun, ia menghairankan tidak mencetak apa-apa! Mengapakah ini berlaku?
Inti isu terletak pada sifat kaedah String.matches(). Tidak seperti kaedah serupa dalam bahasa lain, matches() cuba memadankan keseluruhan rentetan input dengan ungkapan biasa yang disediakan. Dalam erti kata lain, ia menyemak sama ada keseluruhan rentetan sepadan dengan corak.
Ungkapan biasa "[a-z]" hanya sepadan dengan satu aksara abjad huruf kecil. Memandangkan tiada satu pun rentetan input mengandungi hanya satu huruf kecil, kaedah matches() gagal mencari padanan untuk mana-mana rentetan.
Untuk membetulkan isu ini, dua pendekatan boleh diambil:
Pendekatan 1: Menggunakan Corak dan Padanan
Pattern p = Pattern.compile("[a-z]+"); Matcher m = p.matcher(inputString); if (m.find()) { // match found }
Pendekatan ini menggunakan Corak dan Matcher untuk mencari kejadian pertama padanan dalam rentetan input. Ungkapan biasa "[a-z] " sepadan dengan satu atau lebih aksara abjad huruf kecil, iaitu kelakuan yang diingini.
Pendekatan 2: Menambah ' ' pada Kelas Aksara
Untuk kes mudah, seperti menyemak sama ada rentetan mengandungi hanya huruf kecil, anda boleh mengubah suai ungkapan biasa sebagai berikut:
if(s.matches("[a-z]+")) { // match found }
Dengan menambahkan ' ' pada kelas aksara "[a-z]", ungkapan biasa sepadan dengan satu atau lebih aksara abjad huruf kecil, menyelesaikan masalah dengan berkesan.
Dengan memahami tingkah laku pelik String.matches() dan menggunakan alternatif yang disediakan, anda boleh mengelakkan perangkap biasa ini dan mengesahkan rentetan secara berkesan terhadap ungkapan biasa dalam Jawa.
Atas ialah kandungan terperinci Mengapakah Kaedah String.matches() Java Gagal Memadankan Rentetan yang Mengandungi Berbilang Aksara Kecil Apabila Menggunakan Regex Mudah Seperti \'[a-z]\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!