Kecuali saya kehilangan metode built-in yang jelas, apa cara tercepat untuk mendapatkan kemunculan n string dalam sebuah string?
Saya menyadari bahwa saya dapat mengulang metode IndexOf dengan memperbarui indeks awalnya pada setiap iterasi dari loop. Tapi melakukannya dengan cara ini tampaknya sia-sia bagi saya.
Jawaban:
Pada dasarnya itulah yang perlu Anda lakukan - atau setidaknya, itu solusi termudah. Semua yang akan Anda "sia-siakan" adalah biaya pemanggilan metode n - Anda tidak akan benar-benar memeriksa kasus apa pun dua kali, jika Anda memikirkannya. (IndexOf akan kembali segera setelah menemukan kecocokan, dan Anda akan terus melanjutkan dari tempat terakhirnya.)
sumber
StringUtils.ordinalIndexOf()
. C # dengan semua Linq dan fitur luar biasa lainnya, hanya saja tidak memiliki dukungan bawaan untuk ini. Dan ya, sangat penting untuk mendapatkan dukungannya jika Anda berurusan dengan parser dan tokenizers.string
:)Anda benar-benar dapat menggunakan ekspresi reguler
/((s).*?){n}/
untuk mencari kemunculan substring ke-ns
.Di C # mungkin terlihat seperti ini:
Catatan: Saya telah menambahkan
Regex.Escape
solusi asli untuk memungkinkan mencari karakter yang memiliki arti khusus untuk mesin regex.sumber
value
? Dalam kasus saya, saya mencari titik msdn.microsoft.com/en-us/library/…Berikut adalah implementasi rekursif (dari ide di atas ) sebagai metode ekstensi, meniru format metode kerangka kerja:
Juga, berikut adalah beberapa unit test (MBUnit) yang mungkin membantu Anda (untuk membuktikannya benar):
sumber
atau di C # dengan metode ekstensi
sumber
index
awalnya ke -1."BOB".IndexOf("B")
mengembalikan 0, begitu juga fungsi ini untukIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
tidak memeriksa apakahs
adanull
. Dan String.IndexOf (String, Int32) akan melemparkanArgumentNullException
jikamatch
ininull
.Mungkin akan menyenangkan juga untuk bekerja dengan
String.Split()
Metode dan memeriksa apakah kejadian yang diminta ada dalam larik, jika Anda tidak memerlukan indeks, tetapi nilai pada indekssumber
Setelah beberapa pembandingan, ini tampaknya menjadi solusi yang paling sederhana dan paling efisien
sumber
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
menulis fungsi dari itu adalah pekerjaan rumah
sumber
Jawaban Tod bisa disederhanakan.
Keluaran
sumber
Atau sesuatu seperti ini dengan do while loop
sumber
Ini mungkin berhasil:
sumber