Büyük / küçük harfe duyarlı değildir


413

Şunlara sahibim:

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

Ne yapmak ister yapmaktır Ralolabileceğini böylece, vaka duyarsız RAl, rAlvb ve hala uyuyor.

Bunun Ralbüyük / küçük harfe duyarlı olmaması gerektiğini söylemenin bir yolu var mı ?


3
Durum duyarsız regex daha zarif bir çözüm olduğunu düşünüyorum, ancak herkes RegExpdoğrudan kullanıcı girdisi yaratmanın tuzaklarını akılda tutmak gerekir . Örneğin, bir kullanıcı girebilir *ve yapıcıya bir hata atılır RegExp. Kabul edilen çözümde bu sorun yoktur.
pllee

Yanıtlar:


604

.toLowerCase()Sonra ekleyin referrer. Bu yöntem, dizeyi küçük harfli bir dizede döndürür. Sonra, yerine .indexOf()kullanarak ralkullanın Ral.

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

Aynı şey Düzenli İfade kullanılarak da elde edilebilir (özellikle dinamik kalıplara karşı test etmek istediğinizde yararlıdır):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp

16
İkinci yöntem daha doğrudur; birincisi Türk I ve diğer sorunlu büyük / küçük çiftler için başarısız olacaktır: i18nguy.com/unicode/turkish-i18n.html
Domenic

23
Türkçe için toLocaleLowerCase()( ref ) kullanmak daha iyi olur
Mottie

2
ikincisi soruya cevap vermez, sadece oradaysa, maçın dizinini almaz diyor. Soru başlığı yanlış ya da soru.
Maslow

10
@Maslow Sorunun örneği, büyük / küçük harf duyarsızlığını test etmekti. Dizini almak istiyorsanız, String'in.search yöntemini kullanın :var index = referrer.search(/Ral/i);
Rob W

7
Dinamik Düzenli İfade yaklaşımının ek karmaşıklığı, arama dizesi, örneğin "Ral", $. *? Gibi Normal İfade özel karakterleri içermesidir. vb. sorunlarınız olur, bu yüzden özel karakterlerden kaçmanız gerekir, Mike Samuel'in bu yayındaki cevabına bakın
zachelrath

94

Başka bir seçenek de arama yöntemini aşağıdaki gibi kullanmaktır:

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

Tüm dizeyi küçük harfe dönüştürmekten daha zarif görünüyor ve daha verimli olabilir.
İle toLowerCase()kod dizesi üzerinde iki paso olur, tek geçişli küçük harfe dönüştürmek için tüm iple başka istenen dizin için bakmaktır. Kod
ile RegExpistenen dizine uyuyor gibi görünüyor dize üzerinde bir geçiş var.

Bu nedenle, uzun dizelerde RegExpsürümü kullanmanızı öneririm (kısa dizelerde bu verimlilik, RegExpnesneyi oluşturmanın hesabında geliyor sanırım )


2
Bu ayrıca testlerime dayanarak biraz daha hızlı: jsperf.com/case-insensitive-indexof
Ilan Biala

6
2018.10.24 itibariyle toLowerCase, Chrome'da büyük bir farkla kazanıyor. toLowerCase (95.914.378 - ±% 0.89 - en hızlı), normal ifade endeksiOf (269.307 - ±% 0.87% 100 daha yavaş)
nixkuroi

21

RegExp kullanın:

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

Veya şunu kullanın .toLowerCase():

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

1
+1, "Türk I sorunu" ndan ve bunun gibi diğer tuzaklardan kaçınarak potansiyel olarak daha doğru olabilir: i18nguy.com/unicode/turkish-i18n.html
Domenic

15

ES2016'dan biraz daha iyi / daha kolay / daha zarif bir yöntem de kullanabilirsiniz (büyük / küçük harfe duyarlı):

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

veya (büyük / küçük harf duyarlı):

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

İşte bazı karşılaştırmaları .indexOf()ve .includes(): https://dev.to/adroitcoder/includes-vs-indexof-in-javascript



4
@Kyles includes, Chrome'da büyük / küçük harfe duyarlıdır : try 'fooBar'.includes('bar')==>false
drzaus

10

Burada birkaç yaklaşım var.

Yalnızca bu örnek için büyük / küçük harfe duyarlı olmayan bir denetim gerçekleştirmek istiyorsanız, aşağıdakine benzer bir şey yapın.

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

Alternatif olarak, bu kontrolü düzenli olarak gerçekleştiriyorsanız, yeni bir benzer indexOf()yöntem ekleyebilir String, ancak büyük / küçük harfe duyarsız hale getirebilirsiniz.

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

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...

1
Destekleyen modern tarayıcılar için definePropertyöneririm Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});. İki güncelleme: Açık bir dize dönüştürme kullanarak (s+'')ve bir döngüde numaralandırılamaz ( for(var i in '') ... gösterilmez indexOfInsensitive.
Rob W

5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...

@Domenic: Türk kültürüne Saygısızlık, Türkiye gerektiğini düşünün bu yönünü basitleştirmek için bir yazım reform. Çin'de bir dizi basitleştirme reformu yapıldı ve Türkiye'nin Çin nüfusunun% 10'undan daha azı ve çok daha basit bir alfabesi var. Yapılabilir.
Dan Dascalescu

5

Bunu deneyebilirsin

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

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


3

Herhangi bir dil için örnek:

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

2

2016, ve bunu nasıl yapmanın net bir yolu yok? Biraz kopyasını umuyordum. Bir deneyeceğim.

Tasarım notları: Bellek kullanımını en aza indirgemek ve bu nedenle hızı arttırmak istedim - böylece dizelerin kopyalanması / mutasyona uğraması söz konusu değil. Sanırım V8 (ve diğer motorlar) bu işlevi optimize edebilir.

//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;
}

İsim nedenim:

  • Adında IndexOf olmalıdır
  • Sonek eklemeyin - Of şu parametreye başvurur
  • Çok uzun süredir "caseInsensitive" kullanmayın
  • "Doğal" iyi bir adaydır, çünkü varsayılan büyük / küçük harfe duyarlı karşılaştırmalar ilk etapta insanlar için doğal değildir.

Neden olmasın...:

  • toLowerCase() - aynı dizede olası LoLCase çağrıları.
  • RegExp- değişkenle arama yapmak garip. RegExp nesnesi bile karakterlerden kaçmak zorunda kalıyor

2
2016, ve hala İngilizce'nin (veya yalnızca ASCII'ye özgü diğer diller) dünyadaki tek dil olduğunu mu düşünüyorsunuz?
Roland Illig

3
@RolandIllig Ouch. Cevabım diğer kültürleri barındırmıyor, bu bir dezavantaj. Daha fazla kültür için desteğin genişletilmesi konusundaki içgörüleri memnuniyetle karşılarım, dünya işbirlikçilerle daha iyi bir yer.
Todd

1

Daha iyi bir arama yapmak için aşağıdaki kodu kullanın,

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() ) );

İlk uyarıda (), JavaScript "-1" döndürdü - başka bir deyişle, indexOf () bir eşleşme bulamadı: Bunun nedeni "JavaScript" in ilk dizede küçük harf olması ve ikincisinde uygun şekilde büyük harf kullanılmasıdır. İndexOf () ile büyük / küçük harfe duyarlı olmayan arama yapmak için her iki dizeyi de büyük veya küçük harf yapabilirsiniz. Bu, ikinci uyarıda () olduğu gibi JavaScript'in yalnızca aradığınız dizenin oluşumunu kontrol edeceği, büyük harf kullanımının yok sayıldığı anlamına gelir.

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


1

Bir referrerdizi ise,findIndex()

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

0

İşte benim almam:

Senaryo :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.