大文字と小文字を区別しない


413

私は以下を持っています:

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

私がしたいことは作ることです Ralそれができるように、ケース・小文字を区別しないがRAlrAlなど、まだ一致しています。

Ral大文字と小文字を区別しないと言う方法はありますか?


3
大文字と小文字を区別しない正規表現の方がエレガントなソリューションだと思いますが、RegExpユーザー入力から直接を作成する場合の落とし穴を誰もが覚えておく必要があります。たとえば、ユーザーが入力する*と、RegExpコンストラクタでエラーがスローされます。承認されたソリューションにはこの問題はありません。
2014

回答:


604

.toLowerCase()後に追加しreferrerます。このメソッドは、文字列を小文字に変換します。次に、の代わりに.indexOf()usingを使用しralますRal

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

正規表現を使用して同じことを実現することもできます(動的パターンに対してテストする場合に特に役立ちます)。

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

16
後者の方法がより正確です。前者はトルコ語Iとその他の問題のある大文字/小文字のペアでは失敗します:i18nguy.com/unicode/turkish-i18n.html
Domenic

23
トルコ語の場合は、toLocaleLowerCase()ref)を使用する方がよいでしょう
Mottie

2
後者は質問に答えません、それが存在するかどうかのみを示し、一致のインデックスを取得しません。質問のタイトルが間違っているか、質問です。
Maslow 2013

10
@Maslow質問の例は、ケースの不感性のテストに関するものでした。あなたは、インデックスを取得したい場合は、使用して文字列の.search:方法var index = referrer.search(/Ral/i);
ロブ・W

7
動的正規表現アプローチの追加の複雑さは、「Ral」などの検索文字列に$。*?などの正規表現特殊文字が含まれている場合です。など、問題が発生するので、特殊文字をエスケープする必要があります。この投稿のマイクサミュエルの回答を参照してください。endsWithin JavaScript
zachelrath

94

別のオプションは、次のように検索方法を使用することです:

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

文字列全体を小文字に変換するよりもエレガントに見え、より効率的かもしれません。コード列上の2つのパスを持って、ワンパスは小文字に変換する文字列全体上にあり、別の所望のインデックスを探すことです。 と
toLowerCase()
RegExpコードが所望のインデックスに一致するように見える文字列の上で1つのパスを持っています。

したがって、長い文字列ではRegExpバージョンを使用することをお勧めします(短い文字列では、この効率はRegExpオブジェクトを作成するために得られると思います)


2
これも私のテストに基づいてかなり高速です:jsperf.com/case-insensitive-indexof
Ilan Biala

6
2018.10.24現在、toLowerCaseはChromeで大差で勝っています。toLowerCase(95,914,378-±0.89%-最速)、正規表現indexOf(269,307-±0.87%100%遅い)
nixkuroi 2018年

21

RegExpを使用します。

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

または、次を使用します.toLowerCase()

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

1
+1、これは「トルコ語Iの問題」やその他のそのような落とし穴を回避することにより、より正確になる可能性があります。i18nguy.com
Domenic

15

ES2016からは、少し優れた/簡単な/よりエレガントな方法(大文字と小文字を区別)も使用できます。

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

または(大文字と小文字を区別しない):

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

ここではいくつかの比較である.indexOf().includes()https://dev.to/adroitcoder/includes-vs-indexof-in-javascript


1
インクルードでは大文字と小文字が区別されないと思います
カイルの

4
Chromeでは@Kyles includes大文字と小文字を区別します:try 'fooBar'.includes('bar')==>false
drzaus 2018

10

ここにはいくつかのアプローチがあります。

このインスタンスのみに対して大文字と小文字を区別しないチェックを実行する場合は、次のようなことを行います。

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

または、このチェックを定期的に実行している場合は、新しいindexOf()-likeメソッドをに追加できますがString、大文字と小文字は区別されません。

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

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

1
をサポートする最新のブラウザについてはdefineProperty、お勧めしObject.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});ます。使用して明示的な文字列変換:2つの更新(s+'')ループでは、非列挙(for(var i in '') ... 表示されませんindexOfInsensitive
ロブ・W

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

@Domenic:トルコの文化を十分に尊重して、トルコはこの側面を簡略化するためにスペルの改革を検討する必要があります。中国では多くの簡素化改革が行われており、トルコの人口は中国の10%未満で、アルファベットははるかに単純です。できます。
Dan Dascalescu、


3

任意の言語の例:

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

2

それは2016年であり、これを行う方法の明確な方法はありませんか?コピーパスタを期待していた。行きます。

デザインノート:メモリ使用量を最小限に抑え、速度を向上させたいと考えていました。文字列のコピー/変更はありません。V8(および他のエンジン)がこの機能を最適化できると思います。

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

名前の理由:

  • 名前にIndexOfが必要です
  • サフィックスを追加しないでください-Ofは次のパラメーターを参照します
  • 長すぎる "caseInsensitive"は使用しないでください
  • そもそもデフォルトの大文字と小文字を区別する比較は人間にとって自然ではないので、「自然」は良い候補です。

何故なの...:

  • toLowerCase() -同じ文字列でtoLowerCaseが繰り返し呼び出される可能性があります。
  • RegExp-変数で検索するのは面倒です。RegExpオブジェクトでさえ文字をエスケープしなければならないのは厄介です

2
それは2016年ですが、英語(または他のASCIIのみの言語)が世界で唯一の言語だとまだ思いますか?
Roland Illig 2018

3
@RolandIllig痛い。私の答えは他の文化に対応していません、それは欠点です。より多くの文化に対する幅広いサポートへの洞察を歓迎します。世界は協力者とのより良い場所です。
トッド

1

より良い検索を行うには、次のコードを使用します、

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

最初のalert()で、JavaScriptは「-1」を返しました。つまり、indexOf()は一致を検出しませんでした。これは、「JavaScript」が最初の文字列で小文字で、2番目の文字列で適切に大文字になっているためです。indexOf()で大文字と小文字を区別しない検索を実行するには、両方の文字列を大文字または小文字にできます。つまり、2番目のalert()と同様に、JavaScriptは探している文字列の出現のみをチェックし、大文字小文字は無視されます。

リファレンス、 http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm


1

referrerが配列の場合、使用できますfindIndex()

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

0

これが私の見解です。

スクリプト

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.