Saya mencoba membuat pencarian case-insensitive dengan dua string di JavaScript berfungsi.
Biasanya akan seperti ini:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
The /i
flag akan untuk kasus-sensitif.
Tetapi saya perlu mencari string kedua; tanpa bendera itu berfungsi dengan sempurna:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Jika saya menambahkan /i
flag ke contoh di atas, ia akan mencari searchstring dan bukan untuk apa yang ada dalam variabel "searchstring" (contoh berikutnya tidak berfungsi):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Bagaimana saya bisa mencapai ini?
sumber
string.match(/best/i);
.match
untuk perbandingan boolean. Itu mencari di luar hasil pertama. Anda harus berhenti setelah pertandingan pertama yang dilakukan.test
atau.search
dilakukan. Periksa kinerja di sini .toLowerCase
kemungkinan besar akan gagal dalam Tes Turki ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) dan masalah konversi kasus serupa. Saya tidak yakin bagaimanaReGex
menanganinya, tetapi jika saya harus menebak saya akan mengatakan lebih baik.var text = "best"; var exp = new RegExp(test, "i");
. Ini sama dengan/best/i
.Menggantikan
dengan
sumber
s = 'a[b'; r = new RegExp(s)
menghasilkan kesalahan sintaks (kelas karakter yang tidak dikuatkan)Jika Anda hanya mencari string daripada ekspresi reguler yang lebih rumit, Anda dapat menggunakan
indexOf()
- tapi ingat untuk huruf kecil kedua string terlebih dahulu karenaindexOf()
case-sensitive:Atau dalam satu baris:
sumber
Misalkan kita ingin menemukan variabel string
needle
dalam variabel stringhaystack
. Ada tiga gotcha:string.toUpperCase
danstring.toLowerCase
. Gunakan ekspresi reguler yang mengabaikan huruf besar-kecil. Misalnyavar needleRegExp = new RegExp(needle, "i");
diikuti olehneedleRegExp.test(haystack)
.needle
. Hati-hati agarneedle
tidak mengandung ekspresi reguler karakter khusus . Lari ini menggunakanneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
danhaystack
, hanya mengabaikan kasing, pastikan untuk menambahkan"^"
di awal dan"$"
di akhir konstruktor ekspresi reguler Anda.Mempertimbangkan poin (1) dan (2), contohnya adalah:
sumber
ES6 +:
includes()
kembalitrue
jikasearchString
muncul di satu posisi atau lebih ataufalse
sebaliknya.sumber
Jika Anda khawatir tentang kasus "kelas karakter yang tidak ditentukan", menghapus semua karakter non-alfanumerik akan membantu:
sumber
Saya suka jawaban @ CHR15TO, tidak seperti jawaban lain yang pernah saya lihat pada pertanyaan serupa lainnya, jawaban itu benar-benar menunjukkan bagaimana cara keluar dengan benar dari string pencarian yang disediakan oleh pengguna (daripada mengatakan itu perlu tanpa menunjukkan bagaimana).
Namun, itu masih cukup kikuk, dan mungkin relatif lebih lambat. Jadi mengapa tidak memiliki solusi spesifik untuk apa yang mungkin merupakan persyaratan umum untuk coders? (Dan mengapa tidak memasukkannya ke ES6 API BTW?)
Jawaban saya [ https://stackoverflow.com/a/38290557/887092] pada pertanyaan serupa memungkinkan yang berikut:
sumber
Ada dua cara untuk perbandingan kasus sensitif:
Konversikan string ke huruf besar dan kemudian bandingkan dengan menggunakan operator ketat (
===
). Cara ketat operator memperlakukan operan membaca hal-hal di: http://www.thesstech.com/javascript/relational-logical-operatorsPencocokan pola menggunakan metode string:
Gunakan metode string "pencarian" untuk pencarian case-sensitive. Baca tentang pencarian dan metode string lainnya di: http://www.thesstech.com/pattern-matching-using-string-methods
sumber
Saya sering melakukan ini dan menggunakan prototipe 5 garis sederhana yang menerima varargs. Ini cepat dan bekerja di mana-mana .
sumber
Anda bisa membuat semuanya huruf kecil:
sumber
Saya perhatikan bahwa jika pengguna memasukkan string teks tetapi meninggalkan input tanpa memilih opsi autocomplete, tidak ada nilai yang ditetapkan dalam input tersembunyi, bahkan jika string bertepatan dengan satu di array. Jadi, dengan bantuan jawaban lain saya membuat ini:
sumber