Berisi case sensitif

414

Saya memiliki yang berikut ini:

if (referrer.indexOf("Ral") == -1) { ... }

Apa yang saya ingin lakukan adalah untuk membuat Ralkasus sensitif, sehingga dapat RAl, rAl, dll dan masih cocok.

Apakah ada cara untuk mengatakan bahwa Ralitu tidak peka terhadap huruf besar-kecil?

Nate Pet
sumber
3
Saya pikir case regex tidak sensitif adalah solusi yang lebih elegan tetapi semua orang harus ingat perangkap membuat RegExplangsung dari input pengguna. Misalnya pengguna dapat masuk *dan kesalahan akan dilemparkan ke RegExpkonstruktor. Solusi yang diterima tidak memiliki masalah ini.
tinggalkan

Jawaban:

605

Tambahkan .toLowerCase()setelah referrer. Metode ini mengubah string menjadi string huruf kecil. Kemudian, gunakan .indexOf()menggunakan ralbukan Ral.

if (referrer.toLowerCase().indexOf("ral") === -1) { 

Hal yang sama juga dapat dicapai dengan menggunakan Ekspresi Reguler (terutama berguna ketika Anda ingin menguji terhadap pola dinamis):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp
Rob W
sumber
16
Metode yang terakhir lebih tepat; yang pertama akan gagal untuk Turki I dan pasangan huruf besar / huruf kecil bermasalah lainnya: i18nguy.com/unicode/turkish-i18n.html
Domenic
23
Untuk orang Turki, akan lebih baik menggunakan toLocaleLowerCase()( ref )
Mottie
2
yang terakhir tidak menjawab pertanyaan, hanya mengatakan jika ada, tidak mendapatkan indeks pertandingan. Entah judul pertanyaan salah, atau pertanyaan.
Maslow
10
@ Maslow Contoh pertanyaannya adalah tentang menguji kepekaan terhadap kasus. Jika Anda ingin mendapatkan indeks, gunakan metode String.search :var index = referrer.search(/Ral/i);
Rob W
7
Komplikasi tambahan dari pendekatan Ekspresi Reguler dinamis adalah bahwa jika string pencarian, misalnya "Ral", berisi karakter khusus Ekspresi Reguler, seperti $. *? dll., Anda akan memiliki masalah, jadi Anda harus melarikan diri dari karakter khusus, lihat jawaban Mike Samuel pada posting ini: berakhirDengan JavaScript
zachelrath
94

Pilihan lain adalah menggunakan metode pencarian sebagai berikut:

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

Terlihat lebih elegan daripada mengonversi seluruh string menjadi huruf kecil dan mungkin lebih efisien.
Dengan toLowerCase()kode memiliki dua pass melewati string, satu pass ada di seluruh string untuk mengubahnya menjadi huruf kecil dan yang lainnya adalah untuk mencari indeks yang diinginkan.
Dengan RegExpkode memiliki satu melewati string yang terlihat sesuai dengan indeks yang diinginkan.

Oleh karena itu, pada string panjang saya sarankan untuk menggunakan RegExpversi (saya kira bahwa pada string pendek, efisiensi ini ada pada akun pembuatan RegExpobjek)

Kfir Erez
sumber
2
Ini juga sedikit lebih cepat berdasarkan pengujian saya: jsperf.com/case-insensitive-indexof
Ilan Biala
6
Pada 2018.10.24, toLowerCase menang dengan margin besar di Chrome. toLowerCase (95.914.378 - ± 0,89% - tercepat), indeks regexDari (269.307 - ± 0,87% 100% lebih lambat)
nixkuroi
21

Gunakan RegExp:

if (!/ral/i.test(referrer)) {
    ...
}

Atau, gunakan .toLowerCase():

if (referrer.toLowerCase().indexOf("ral") == -1)
gilly3
sumber
1
+1, ini bisa berpotensi lebih benar dengan menghindari "masalah Turki I" dan perangkap lainnya: i18nguy.com/unicode/turkish-i18n.html
Domenic
15

Dari ES2016 Anda juga dapat menggunakan metode yang sedikit lebih baik / lebih mudah / lebih elegan (case-sensitive):

if (referrer.includes("Ral")) { ... }

atau (tidak peka huruf besar-kecil):

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

Berikut adalah beberapa perbandingan .indexOf()dan .includes(): https://dev.to/adroitcoder/includes-vs-indexof-in-javascript

Łukasz Matuszewski
sumber
1
Saya tidak berpikir termasuk tidak peka huruf besar kecil
Kyle
4
@Kyles includesadalah case-sensitive di Chrome: try 'fooBar'.includes('bar')==>false
drzaus
10

Ada beberapa pendekatan di sini.

Jika Anda ingin melakukan pemeriksaan case-sensitive untuk hal ini saja, lakukan sesuatu seperti berikut ini.

if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
    ...

Atau, jika Anda melakukan pemeriksaan ini secara rutin, Anda dapat menambahkan indexOf()metode seperti baru String, tetapi membuatnya tidak sensitif.

String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
pipi
sumber
1
Untuk browser modern yang mendukung defineProperty, saya sarankan Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});. Dua pembaruan: Konversi string eksplisit menggunakan (s+''), dan non-enumerable dalam satu lingkaran ( for(var i in '') ... tidak ditampilkan indexOfInsensitive.
Rob W
5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
Kendall Frey
sumber
@Domenic: Dengan segala hormat pada budaya Turki, Turki harus mempertimbangkan reformasi ejaan untuk menyederhanakan aspek ini. Cina telah melakukan sejumlah reformasi penyederhanaan , dan Turki memiliki kurang dari 10% populasi Cina, dan alfabet yang jauh lebih sederhana. Itu bisa dilakukan.
Dan Dascalescu
5

Anda bisa mencoba ini

str = "Wow its so COOL"
searchStr = "CoOl"

console.log(str.toLowerCase().includes(searchStr.toLowerCase()))

Bakarali Sunasra
sumber
3

Contoh untuk bahasa apa pun:

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
alex_1948511
sumber
2

Ini tahun 2016, dan tidak ada cara yang jelas bagaimana melakukan ini? Saya berharap untuk beberapa copypasta. Saya akan mencoba.

Catatan desain: Saya ingin meminimalkan penggunaan memori, dan karenanya meningkatkan kecepatan - sehingga tidak ada penyalinan / mutasi string. Saya berasumsi V8 (dan mesin lainnya) dapat mengoptimalkan fungsi ini.

//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
    //TODO: guard conditions here

    var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
    var needleIndex = 0;
    var foundAt = 0;
    for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
        var needleCode = needle.charCodeAt(needleIndex);
        if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
        var haystackCode = haystack.charCodeAt(haystackIndex);
        if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser

        //TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
        //if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
        if (haystackCode !== needleCode)
        {
            foundAt = haystackIndex;
            needleIndex = 0; //Start again
        }
        else
            needleIndex++;

        if (needleIndex == needle.length)
            return foundAt;
    }

    return -1;
}

Alasan saya untuk nama:

  • Seharusnya ada IndexOf dalam namanya
  • Jangan tambahkan akhiran - Of merujuk ke parameter berikut
  • Jangan gunakan "caseInsensitive" yang terlalu panjang
  • "alami" adalah kandidat yang baik, karena perbandingan sensitif case default tidak alami bagi manusia sejak awal.

Kenapa tidak...:

  • toLowerCase() - panggilan potensial berulang ke toLowerCase pada string yang sama.
  • RegExp- canggung untuk mencari dengan variabel. Bahkan objek RegExp canggung harus melarikan diri karakter
Todd
sumber
2
Ini tahun 2016, dan Anda masih berpikir bahwa bahasa Inggris (atau hanya bahasa ASCII lainnya) adalah satu-satunya bahasa di dunia?
Roland Illig
3
@RollandIllig Aduh. Jawaban saya tidak mengakomodasi budaya lain, itu adalah kelemahan. Saya akan menyambut wawasan apa pun tentang perluasan dukungan untuk lebih banyak budaya, dunia adalah tempat yang lebih baik dengan kolaborator.
Todd
1

Untuk melakukan pencarian yang lebih baik gunakan kode berikut,

var myFav   = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";

// Check for matches with the plain vanilla indexOf() method:
alert( theList.indexOf( myFav ) );

// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );

Pada lansiran pertama (), JavaScript mengembalikan "-1" - dengan kata lain, indexOf () tidak menemukan kecocokan: ini hanya karena "JavaScript" dalam huruf kecil di string pertama, dan huruf besar dalam huruf kedua. Untuk melakukan pencarian case-insensitive dengan indexOf (), Anda dapat membuat kedua string baik huruf besar atau kecil. Ini berarti bahwa, seperti pada peringatan kedua (), JavaScript hanya akan memeriksa kemunculan string yang Anda cari, kapitalisasi diabaikan.

Referensi, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm

Diganta Kumar
sumber
1

Jika referrerarray, Anda dapat menggunakanfindIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
A-Sharabiani
sumber
0

Inilah pendapat saya:

Skrip :

var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
  $("#textContainer").html(originalText)
  var text = $("#textContainer").html()
  var val = $("#search").val()
  if(val=="") return;
  var matches = text.split(val)
  for(var i=0;i<matches.length-1;i++) {
    var ind =  matches[i].indexOf(val)
    var len = val.length
      matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
  }
  $("#textContainer").html(matches.join(""))

HTML:

<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>

Codepen

Michael Seltenreich
sumber