Saya mencoba untuk menemukan posisi dari semua kemunculan string dalam string lain, case-insensitive.
Misalnya, diberikan string:
Saya belajar memainkan Ukulele di Lebanon.
dan string pencarian le
, saya ingin mendapatkan array:
[2, 25, 27, 33]
Kedua string tersebut akan menjadi variabel - yaitu, saya tidak dapat membuat kode keras nilainya.
Saya pikir ini adalah tugas yang mudah untuk ekspresi reguler, tetapi setelah berjuang beberapa saat untuk menemukan yang akan berhasil, saya tidak beruntung.
Saya menemukan contoh cara melakukannya dengan menggunakan .indexOf()
, tetapi tentunya harus ada cara yang lebih ringkas untuk melakukannya?
sumber
le
menjadi string variabel di sini? Bahkan saat menggunakannew Regexp(str);
bahaya karakter khusus mengintai, mencari$2.50
misalnya. Sesuatu sepertiregex = new Regexp(dynamicstring.replace(/([\\.+*?\\[^\\]$(){}=!<>|:])/g, '\\$1'));
akan IMHO lebih dekat. Saya tidak yakin apakah js memiliki mekanisme pelolosan regex bawaan.new RegExp(searchStr)
akan menjadi jalannya, dan ya, dalam kasus umum Anda harus melarikan diri dari karakter khusus. Ini tidak benar-benar layak dilakukan kecuali Anda membutuhkan tingkat keumuman itu.searchStr=aaa
dan itustr=aaaaaa
. Kemudian alih-alih menemukan 4 kejadian, kode Anda hanya akan menemukan 2 karena Anda membuat lompatansearchStr.length
dalam loop.Ini adalah versi gratis regex:
EDIT : dan jika Anda ingin mencocokkan string seperti 'aaaa' dan 'aa' untuk menemukan [0, 2] gunakan versi ini:
sumber
var result = indexes('aaaa', 'aa')
? Hasil yang diharapkan harus[0, 1, 2]
atau[0, 2]
?i+=find.length;
dan di laini++
Anda pasti bisa melakukan ini!
Edit: belajar mengeja RegExp
Juga, saya menyadari ini bukan persis apa yang Anda inginkan,
lastIndex
memberitahu kita akhir jarum tidak awal, tapi dekat - Anda bisa mendorongre.lastIndex-needle.length
ke dalam hasil array yang ...Edit: menambahkan link
Jawaban @ Tim Down menggunakan objek hasil dari RegExp.exec (), dan semua sumber daya Javascript saya mengabaikan penggunaannya (selain memberi Anda string yang cocok). Jadi saat dia menggunakan
result.index
, itu semacam Objek Pencocokan yang tidak disebutkan namanya. Dalam deskripsi MDC tentang exec , mereka benar-benar mendeskripsikan objek ini dengan detail yang layak.sumber
Satu liner menggunakan
String.protype.matchAll
(ES2020):Menggunakan nilai-nilai Anda:
Jika Anda khawatir tentang melakukan penyebaran dan
map()
dalam satu baris, saya menjalankannya dengan satufor...of
putaran untuk satu juta iterasi (menggunakan string Anda). Rata-rata satu liner 1420ms sedangkanfor...of
rata rata 1150ms di mesin saya. Itu bukan perbedaan yang signifikan, tetapi satu liner akan berfungsi dengan baik jika Anda hanya melakukan beberapa pertandingan.Lihat
matchAll
di caniusesumber
Jika Anda hanya ingin menemukan posisi semua pertandingan, saya ingin mengarahkan Anda ke sedikit retasan:
Ini mungkin tidak dapat diterapkan jika Anda memiliki RegExp dengan panjang variabel tetapi untuk beberapa itu mungkin membantu.
Ini peka huruf besar / kecil. Untuk kasus ketidakpekaan, gunakan
String.toLowerCase
fungsi sebelumnya.sumber
Berikut adalah Kode sederhana
sumber
Ikuti jawaban @jcubic, solusinya menyebabkan sedikit kebingungan untuk kasus saya
Misalnya
var result = indexes('aaaa', 'aa')
akan kembali[0, 1, 2]
daripada[0, 2]
Jadi saya memperbarui sedikit solusinya seperti di bawah ini agar sesuai dengan kasus saya
sumber
Terima kasih atas semua balasannya. Saya memeriksa semuanya dan menemukan fungsi yang memberikan indeks terakhir pertama dari setiap kemunculan substring 'jarum'. Saya mempostingnya di sini seandainya itu akan membantu seseorang.
Harap dicatat, ini tidak sama dengan permintaan awal hanya untuk permulaan dari setiap kejadian. Ini lebih cocok untuk kasus penggunaan saya karena Anda tidak perlu menjaga panjang jarum.
sumber
Periksa solusi ini yang juga dapat menemukan string karakter yang sama, beri tahu saya jika ada yang kurang atau tidak benar.
sumber
sumber
kode di bawah ini akan melakukan pekerjaan untuk Anda:
sumber
Gunakan String.prototype.match .
Berikut adalah contoh dari dokumen MDN itu sendiri:
sumber