Mengapa algoritme berikut tidak berhenti untuk saya? (str adalah string yang saya cari, findStr adalah string yang saya coba temukan)
String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;
while (lastIndex != -1) {
lastIndex = str.indexOf(findStr,lastIndex);
if( lastIndex != -1)
count++;
lastIndex += findStr.length();
}
System.out.println(count);
Jawaban:
Baris terakhir membuat masalah.
lastIndex
tidak akan pernah berada di -1, jadi akan ada loop tak terbatas. Ini dapat diperbaiki dengan memindahkan baris kode terakhir ke blok if.sumber
Bagaimana kalau menggunakan StringUtils.countMatches dari Apache Commons Lang?
Output itu:
sumber
StringUtils
belumcountMatches
metode.Anda
lastIndex += findStr.length();
ditempatkan di luar tanda kurung, menyebabkan pengulangan tak terbatas (ketika tidak ada kemunculan yang ditemukan, lastIndex selalu kefindStr.length()
).Ini adalah versi tetapnya:
sumber
Versi yang lebih pendek. ;)
sumber
return haystack.split(Pattern.quote(needle), -1).length - 1;
jika misalnyaneedle=":)"
,-1
itu akan menjatuhkan jejak pertandingan.Apakah Anda benar-benar harus menangani pencocokan sendiri? Terutama jika yang Anda butuhkan hanyalah jumlah kemunculan, ekspresi reguler lebih rapi:
sumber
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
yang+
tanda memiliki arti khusus dalam regex dan kebutuhan untuk melarikan diri.Pattern.quote(str)
itu teman Anda!Saya sangat terkejut tidak ada yang menyebutkan liner yang satu ini. Sederhana, ringkas, dan berkinerja sedikit lebih baik daripada
str.split(target, -1).length-1
sumber
Ini dia, dibungkus dengan metode yang bagus dan dapat digunakan kembali:
sumber
di akhir hitungan loop adalah 3; semoga membantu
sumber
findStr.length() - 1
hasilnya 0 dan kita berada dalam siklus tanpa akhir.Banyak jawaban yang diberikan gagal pada satu atau lebih dari:
Inilah yang saya tulis:
Contoh panggilan:
Jika Anda menginginkan pencarian non-regular-expression, cukup kompilasi pola Anda secara tepat dengan
LITERAL
flag:sumber
sumber
replace
, bukanreplaceAll
.Kenaikan
lastIndex
setiap kali Anda mencari kejadian berikutnya.Jika tidak, selalu menemukan substring pertama (pada posisi 0).
sumber
Mengembalikan indeks dalam string ini dari kemunculan pertama dari karakter yang ditentukan, memulai pencarian pada indeks yang ditentukan.
Jadi
lastindex
nilai Anda selalu 0 dan selalu menemukan hello dalam string.sumber
Jawaban yang diberikan sebagai benar tidak baik untuk menghitung hal-hal seperti pengembalian baris dan terlalu bertele-tele. Jawaban selanjutnya lebih baik tetapi semua bisa dicapai hanya dengan
Itu tidak menjatuhkan kecocokan trailing menggunakan contoh dalam pertanyaan.
sumber
Anda dapat jumlah kejadian menggunakan fungsi perpustakaan bawaan:
sumber
coba tambahkan
lastIndex+=findStr.length()
ke akhir loop Anda, jika tidak, Anda akan berakhir dalam loop tanpa akhir karena setelah Anda menemukan substring, Anda mencoba menemukannya berulang kali dari posisi terakhir yang sama.sumber
Coba yang ini. Ini menggantikan semua pertandingan dengan a
-
.Dan jika Anda tidak ingin menghancurkan Anda,
str
Anda dapat membuat string baru dengan konten yang sama:Setelah menjalankan blok ini, ini akan menjadi nilai Anda:
sumber
Seperti yang disarankan @Mr_and_Mrs_D:
sumber
Berdasarkan jawaban yang ada, saya ingin menambahkan versi "lebih pendek" tanpa if:
sumber
Berikut adalah versi lanjutan untuk menghitung berapa kali token terjadi dalam string yang dimasukkan pengguna:
sumber
Metode di bawah ini menunjukkan berapa banyak waktu pengulangan substring pada seluruh string Anda. Semoga bermanfaat bagi Anda: -
sumber
berikut adalah solusi lain tanpa menggunakan regexp / patterns / matchers atau bahkan tidak menggunakan StringUtils.
sumber
Jika Anda membutuhkan indeks setiap substring dalam string asli, Anda dapat melakukan sesuatu dengan indexOf seperti ini:
sumber
}
sumber
Solusi ini mencetak jumlah total kemunculan substring tertentu di seluruh string, juga mencakup kasus di mana terdapat kecocokan yang tumpang tindih.
sumber