Apa perbedaan antara dua ekspresi berikut?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Jawaban:
Yang pertama cocok dengan satu spasi, sedangkan yang kedua cocok dengan satu atau banyak spasi. Mereka disebut pembilang ekspresi reguler, dan mereka melakukan kecocokan seperti ini (diambil dari dokumentasi ):
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
Kedua replaceAll
panggilan tersebut akan selalu memberikan hasil yang sama, apapun x
itu. Namun, penting untuk diperhatikan bahwa kedua ekspresi reguler itu tidak sama:
\\s
- cocok dengan karakter spasi putih tunggal \\s+
- mencocokkan urutan dari satu atau lebih karakter spasi.Dalam hal ini, tidak ada bedanya, karena Anda mengganti semuanya dengan string kosong (meskipun akan lebih baik menggunakan \\s+
dari sudut pandang efisiensi). Jika Anda mengganti dengan string yang tidak kosong, keduanya akan berperilaku berbeda.
Pertama-tama Anda perlu memahami bahwa hasil akhir dari kedua pernyataan akan sama yaitu menghapus semua spasi dari string yang diberikan.
Namun x.replaceAll("\\s+", "");
akan lebih efisien cara pemangkasan spasi (jika string dapat memiliki beberapa spasi yang berdekatan) karena berpotensi lebih sedikit tidak ada penggantian karena fakta bahwa regex \\s+
cocok dengan 1 atau lebih spasi sekaligus dan menggantinya dengan string kosong.
Jadi meskipun Anda mendapatkan hasil yang sama dari keduanya, lebih baik gunakan:
x.replaceAll("\\s+", "");
Regex pertama akan cocok dengan satu karakter spasi. Regex kedua akan dengan enggan mencocokkan satu atau lebih karakter spasi. Untuk sebagian besar tujuan, kedua ekspresi reguler ini sangat mirip, kecuali pada kasus kedua, ekspresi reguler dapat mencocokkan lebih banyak string, jika hal itu mencegah pencocokan ekspresi reguler gagal. dari http://www.coderanch.com/t/570917/java/java/regex-difference
\s+
, bukan \s+?
seperti pertanyaan lainnya.