Bagaimana cara saya melakukan perbandingan string yang tidak sensitif huruf pada JavaScript?
javascript
string
flybywire
sumber
sumber
.localeCompare()
metode javascript yang baru ditambahkan . Hanya didukung oleh browser modern pada saat penulisan (IE11 +). lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
kembali1
di Konsol Chrome 48."a"
datang sebelum"A"
saat diurutkan. Seperti"a"
datang sebelumnya"b"
. Jika perilaku ini tidak diinginkan, seseorang mungkin ingin.toLowerCase()
setiap huruf / string. yaitu."A".toLowerCase().localeCompare( "a".toLowerCase() )
lihat developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
akan memeriksa kesetaraan tetapi tidak akan cukup baik untuk menyortir / memesan string (lih. pertanyaan yang awalnya saya tautkan).Jawaban:
Cara termudah untuk melakukannya (jika Anda tidak khawatir tentang karakter Unicode khusus) adalah menelepon
toUpperCase
:sumber
if you're not worried about special Unicode characters
.toUpperCase
lebihtoLowerCase
?EDIT : Jawaban ini awalnya ditambahkan 9 tahun yang lalu. Hari ini Anda harus menggunakan
localeCompare
dengansensitivity: 'accent'
opsi:The
{ sensitivity: 'accent' }
memberitahulocaleCompare()
untuk mengobati dua varian surat dasar yang sama sebagai yang sama kecuali mereka memiliki aksen yang berbeda (seperti dalam contoh ketiga) di atas.Atau, Anda dapat menggunakan
{ sensitivity: 'base' }
, yang memperlakukan dua karakter sebagai setara selama karakter dasarnya adalah sama (sehinggaA
akan diperlakukan sebagai setara denganá
).Perhatikan bahwa parameter ketiga
localeCompare
tidak didukung di IE10 atau lebih rendah atau peramban seluler tertentu (lihat bagan kompatibilitas pada halaman yang ditautkan di atas), jadi jika Anda perlu mendukung peramban tersebut, Anda akan memerlukan semacam fallback:Jawaban asli
Cara terbaik untuk melakukan perbandingan kasus yang tidak sensitif dalam JavaScript adalah menggunakan
match()
metode RegExp dengani
benderanya.Pencarian case-sensitive
Ketika kedua string yang dibandingkan adalah variabel (bukan konstanta), maka itu sedikit lebih rumit karena Anda perlu membuat RegExp dari string tetapi meneruskan string ke konstruktor RegExp dapat menghasilkan kecocokan yang salah atau kecocokan yang gagal jika string memiliki regex khusus karakter di dalamnya.
Jika Anda peduli tentang internasionalisasi, jangan gunakan
toLowerCase()
atautoUpperCase()
karena tidak memberikan perbandingan kasus-sensitif yang akurat dalam semua bahasa.http://www.i18nguy.com/unicode/turkish-i18n.html
sumber
'a'.localeCompare('A')
dan seperti op saya sedang mencari membandingkan string case sensitif.localeCompare
Versi mengharuskan mesin JavaScript mendukung API ECMAScript® Internasionalisasi , yang itu tidak diperlukan untuk melakukan. Jadi sebelum mengandalkannya, Anda mungkin ingin memeriksa apakah itu berfungsi di lingkungan yang Anda gunakan. Misalnya:const compareInsensitive = "x".localeCompare("X", undefined, {sensitivity: "base"}) === 0 ? (a, b) => a.localeCompare(b, undefined, {sensitivity: "base"}) : (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
atau semacamnya.Seperti yang dikatakan dalam komentar baru-baru ini,
string::localeCompare
mendukung perbandingan kasus sensitif (antara hal-hal kuat lainnya).Ini contoh sederhana
Dan fungsi generik yang bisa Anda gunakan
Perhatikan bahwa alih-alih
undefined
Anda mungkin harus memasukkan lokal spesifik yang Anda gunakan untuk bekerja. Ini penting sebagaimana dinyatakan dalam dokumen MDNOpsi sensitivitas
Dukungan browser
Pada saat pengeposan, UC Browser untuk Android dan Opera Mini tidak mendukung parameter lokal dan opsi . Silakan periksa https://caniuse.com/#search=localeCompare untuk info terkini.
sumber
Dengan bantuan ekspresi reguler juga bisa kita raih.
/i
untuk mengabaikan kasus. Jika tidak perlu, kita dapat mengabaikan dan menguji untuk TIDAK pertandingan yang sensitif sepertisumber
keyWORD
akan menghasilkan hasil dalam kecocokan positif. Tetapi stringthis is a keyword yo
ataukeywords
juga akan menghasilkan kecocokan positif. Sadarilah itu :-)/^keyword$/.test(source)
, tetapi 1) jikakeyword
bukan konstanta, Anda harus melakukannyanew RegExp('^' + x + '$').test(source)
dan 2) beralih ke regexp untuk menguji sesuatu yang sederhana seperti kesetaraan string case-insensitive. sama sekali tidak sangat efisien.Ingatlah bahwa casing adalah operasi khusus lokal. Bergantung pada skenario, Anda mungkin ingin mempertimbangkannya. Misalnya, jika Anda membandingkan nama dua orang, Anda mungkin ingin mempertimbangkan lokal tetapi jika Anda membandingkan nilai yang dihasilkan mesin seperti UUID maka Anda mungkin tidak. Ini sebabnya saya menggunakan fungsi berikut di perpustakaan utils saya (perhatikan bahwa pengecekan tipe tidak termasuk untuk alasan kinerja).
sumber
compareStrings("", "")
akan memberifalse
meskipun fakta string sama.true
untuk saya. Mungkin itu adalah bug pada browser Anda?Saya baru-baru ini membuat perpustakaan mikro yang menyediakan pembantu string case-insensitive: https://github.com/nickuraltsev/ignore-case . (Ini menggunakan
toUpperCase
internal.)sumber
jika Anda khawatir tentang arah ketidaksetaraan (mungkin Anda ingin menyortir daftar), Anda cukup banyak harus melakukan konversi kasus, dan karena ada lebih banyak karakter huruf kecil di unicode daripada huruf besar keLowerCase mungkin konversi terbaik untuk digunakan.
Javascript tampaknya menggunakan lokal "C" untuk perbandingan string sehingga urutan yang dihasilkan akan jelek jika string berisi selain huruf ASCII. tidak banyak yang dapat dilakukan tentang itu tanpa melakukan pemeriksaan yang lebih rinci dari string.
sumber
Misalkan kita ingin mencari 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 huruf besar, pastikan untuk menambahkan"^"
di awal dan"$"
di akhir konstruktor ekspresi reguler Anda.Mempertimbangkan poin (1) dan (2), contohnya adalah:
sumber
new RegExp(...)
bagian dalam baris 3 dengan berikut ini:new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Ini memastikan bahwa tidak ada karakter lain sebelum atau setelah string pencarian Andaneedle
.Ada dua cara untuk perbandingan kasus sensitif:
===
). Cara ketat operator memperlakukan operan membaca hal-hal di: http://www.thesstech.com/javascript/relational-logical-operatorsGunakan 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
Banyak jawaban di sini, tapi saya ingin menambahkan solusi berdasarkan memperpanjang lib String:
Dengan cara ini Anda bisa menggunakannya seperti yang Anda lakukan di Jawa!
Contoh:
Output akan menjadi:
sumber
Gunakan RegEx untuk pencocokan string atau perbandingan.
Dalam JavaScript, Anda dapat menggunakan
match()
untuk perbandingan string, jangan lupa untuk memasukkani
RegEx.Contoh:
sumber
matchString.match(/^test$/i)
.matchString.match(/x/i)
berfungsi? Jika tidak, apa yang akan berhasil?sumber
Jika kedua string memiliki lokal yang sama, Anda mungkin ingin menggunakan
Intl.Collator
objek seperti ini:Jelas, Anda mungkin ingin melakukan cache
Collator
untuk efisiensi yang lebih baik.Keuntungan dari pendekatan ini adalah bahwa ia harus jauh lebih cepat daripada menggunakan RegExps dan didasarkan pada seperangkat kolektor siap pakai yang digunakan (lihat deskripsi
locales
danoptions
parameter konstruktor dalam artikel di atas).sumber
accent
, yang membuatnya tidak sensitif, tetapi memperlakukana
daná
sebagai karakter yang terpisah. Jadibase
atauaccent
keduanya bisa sesuai tergantung pada kebutuhan yang tepat.Saya menulis ekstensi. sangat sepele
sumber
String#isEqual
atauObject#isEqual
secara alami semua halaman Anda berperilaku berbeda dan mungkin melakukan hal-hal aneh jika spesifikasinya tidak cocok dengan Anda.Bahkan pertanyaan ini sudah dijawab. Saya memiliki pendekatan berbeda untuk menggunakan RegExp dan mencocokkan untuk mengabaikan case sensitif. Silakan lihat tautan saya https://jsfiddle.net/marchdave/7v8bd7dq/27/
sumber
Bagaimana kalau TIDAK melempar pengecualian dan TIDAK menggunakan regex lambat?
Cuplikan di atas menganggap Anda tidak ingin mencocokkan jika string tersebut nol atau tidak terdefinisi.
Jika Anda ingin mencocokkan null / tidak terdefinisi, maka:
Jika karena alasan tertentu Anda peduli tentang undefined vs null:
sumber
str1 == str2 || ...
Karena tidak ada jawaban yang dengan jelas memberikan cuplikan kode sederhana untuk digunakan
RegExp
, inilah upaya saya:Ini memiliki beberapa keunggulan:
undefined
misalnya, akan menabrak ekspresi sepertistr1.toUpperCase()
).RegExp
string.sumber
Ini adalah versi perbaikan dari jawaban ini .
Penggunaan & tes:
Tampilkan cuplikan kode
sumber
Ubah keduanya menjadi lebih rendah (hanya sekali untuk alasan kinerja) dan bandingkan dengan operator ternary dalam satu baris:
sumber
Jika Anda tahu Anda berurusan dengan
ascii
teks maka Anda bisa menggunakan perbandingan offset huruf besar / kecil.Pastikan string Anda "sempurna" (yang ingin Anda cocokkan) adalah huruf kecil:
sumber
Saya suka variasi tulisan cepat ini -
Cepat dalam pemrosesan, dan melakukan apa yang dimaksudkan.
sumber
javascript
Perpustakaan ini tampaknya menyediakan banyak operasi string. Sangat nyaman digunakanBagaimana cara meng-install
Impor
Abaikan Bandingkan String
sumber