Saya mencoba memahami perbedaan antara matches()
dan find()
.
Menurut Javadoc, (dari apa yang saya mengerti), matches()
akan mencari seluruh string bahkan jika ia menemukan apa yang dicari, dan find()
akan berhenti ketika menemukan apa yang dicari.
Jika asumsi itu benar, saya tidak dapat melihat kapan pun Anda ingin menggunakannya matches()
sebagai pengganti find()
, kecuali jika Anda ingin menghitung jumlah kecocokan yang ditemukannya.
Menurut pendapat saya, kelas String seharusnya find()
bukan matches()
sebagai metode inbuilt.
Jadi untuk meringkas:
- Apakah asumsi saya benar?
- Kapan itu berguna untuk digunakan,
matches()
bukanfind()
?
find()
beberapa kali dapat memberikan hasil yang berbeda untuk hal yang samaMatcher
. Lihat jawaban saya di bawah ini.Jawaban:
matches
mencoba untuk mencocokkan ekspresi dengan seluruh string dan secara implisit menambahkan^
di awal dan$
di akhir pola Anda, artinya tidak akan mencari substring. Maka output dari kode ini:123
adalah substringa123b
sehinggafind()
metode ini menghasilkan true.matches()
hanya 'melihat'a123b
yang tidak sama dengan123
dan karenanya menghasilkan false.sumber
matchers()
bukan hanyafind()
dengan ^ dan $. Sadarilah bahwa menelepon.find()
lebih dari satu kali dapat memiliki hasil yang berbeda jika tidak didahului olehreset()
, sementaramatches()
akan selalu mengembalikan hasil yang sama. Lihat jawaban saya di bawah ini.matches
mengembalikan true jika seluruh string cocok dengan pola yang diberikan.find
mencoba menemukan substring yang cocok dengan pola.sumber
matches(p)
sama sepertifind("^" + p + "$")
jika itu lebih jelas."123abc123".matches("[a-z]+")
akan gagal seperti biasa"123abc123".find("^[a-z]+$")
. Maksud saya adalah, itumatches()
berlaku untuk pertandingan yang lengkap, seperti halnyafind()
dengan jangkar awal dan akhir.Pattern.compile("some pattern").matcher(str).matches()
sama denganPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
ini tidak persis sama untuk...("^some pattern$").matcher(str).find()
yang hanya berlaku dalam panggilan pertama. Lihat jawaban saya di bawah ini.matches()
hanya akan mengembalikan true jika string penuh cocok.find()
akan mencoba menemukan kemunculan berikutnya dalam substring yang cocok dengan regex. Perhatikan penekanannya pada "selanjutnya". Itu berarti, hasil panggilanfind()
beberapa kali mungkin tidak sama. Selain itu, dengan menggunakanfind()
Anda dapat meneleponstart()
untuk mengembalikan posisi substring yang cocok.Akan menghasilkan:
Jadi, berhati-hatilah saat memanggil
find()
beberapa kali jikaMatcher
objek tidak disetel ulang, bahkan ketika regex dikelilingi dengan^
dan$
untuk mencocokkan string penuh.sumber
find()
akan mempertimbangkan sub-string terhadap ekspresi reguler di manamatches()
akan mempertimbangkan ekspresi lengkap.find()
akan mengembalikan true hanya jika sub-string dari ekspresi cocok dengan pola.sumber
matches();
tidak buffer, tetapifind()
buffer.find()
pertama-tama mencari ke akhir string, mengindeks hasilnya, dan mengembalikan nilai boolean dan indeks yang sesuai.Itu sebabnya ketika Anda memiliki kode seperti
Pada 4: Mesin regex menggunakan struktur pola akan membaca seluruh kode Anda (indeks ke indeks seperti yang ditentukan oleh
regex[single character]
untuk menemukan setidaknya satu kecocokan. Jika kecocokan ditemukan, itu akan diindeks maka loop akan dijalankan berdasarkan pada hasil yang diindeks lain jika itu tidak melakukan perhitungan di depan seperti itumatches()
, tidak.Kesimpulan sementara tidak akan pernah dijalankan karena karakter pertama dari string yang cocok bukan alfabet.sumber