web-dev-qa-db-ja.com

JavaScriptの大文字と小文字を区別しない文字列比較

JavaScriptで大文字と小文字を区別しない文字列比較を実行する方法

875
flybywire

これを行う最も簡単な方法は(特殊なUnicode文字を心配していない場合)、toUpperCaseを呼び出すことです。

var areEqual = string1.toUpperCase() === string2.toUpperCase();
990
SLaks

_ edit _ :この回答はもともと9年前に追加されました今日は localeComparesensitivity: 'accent'オプションと一緒に使うべきです:

function ciEquals(a, b) {
    return typeof a === 'string' && typeof b === 'string'
        ? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
        : a === b;
}

console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));

{ sensitivity: 'accent' }は、同じ基本文字の2つの変形を同じexceptとして扱うようにlocaleCompare()に指示します。それらは上記の3番目の例のように異なるアクセントを持ちます。

あるいは、{ sensitivity: 'base' }を使用することもできます。これは、2つの文字が、それらの基本文字が同じである限り同じものとして扱う(したがって、Aáと同じものとして扱われます)。

localeCompareの3番目のパラメータは、IE10以下または特定のモバイルブラウザではサポートされていません(上記リンクの互換性チャートを参照)。そのため、これらのブラウザをサポートする必要がある場合フォールバックの種類:

function ciEqualsInner(a, b) {
    return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}

function ciEquals(a, b) {
    if (typeof a !== 'string' || typeof b !== 'string') {
        return a === b;
    }

    //      v--- feature detection
    return ciEqualsInner('A', 'a')
        ? ciEqualsInner(a, b)
        : /*  fallback approach here  */;
}

元の回答

JavaScriptで大文字と小文字を区別しないで比較するには、iフラグを指定してRegExp match()メソッドを使用するのが最善の方法です。

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

比較される両方の文字列が変数(定数ではない)の場合、文字列からRegExpを生成する必要がありますが、文字列が特別な正規表現を持つ場合、RegExpコンストラクタに文字列を渡すと正しく一致しないことがあります。その中の文字。

国際化に関心がある場合は、toLowerCase()toUpperCase()を使用しないでください。すべての言語で大文字と小文字が区別されない正確な比較が提供されないからです。

http://www.i18nguy.com/unicode/turkish-i18n.html

144
Samuel Neff

正規表現の助けを借りても私たちは達成することができます。

(/keyword/i).test(source)

/iは大文字と小文字を区別しないためです。必要でなければ、大文字と小文字を区別しないNOTマッチを無視してテストできます。

(/keyword/).test(source)
31
SP007

大文字小文字の区別はロケール固有の操作です。シナリオによっては、それを考慮に入れることをお勧めします。たとえば、2人の人物の名前を比較している場合はロケールを検討しますが、UUIDなどの機械生成値を比較している場合はそうではないかもしれません。私が私のutilsライブラリで以下の関数を使うのはこのためです(型チェックはパフォーマンス上の理由から含まれていないことに注意してください)。

function compareStrings (string1, string2, ignoreCase, useLocale) {
    if (ignoreCase) {
        if (useLocale) {
            string1 = string1.toLocaleLowerCase();
            string2 = string2.toLocaleLowerCase();
        }
        else {
            string1 = string1.toLowerCase();
            string2 = string2.toLowerCase();
        }
    }

    return string1 === string2;
}
26
Shital Shah

最近のコメントで述べたように、 string::localCompare は大文字と小文字を区別しない(他の強力なものの中でも)比較をサポートします。

これは簡単な例です

'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // returns 0

そしてあなたが使うことができる一般的な関数

function equalsIgnoringCase(text, other) {
    text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}

undefinedの代わりに、おそらくあなたが作業している特定のロケールを入力するべきです。 MDNドキュメントに示されているように、これは重要です。

スウェーデン語では、äとaは別々の基本文字です。

感度オプション

Sensitivity options tabulated from MDN

ブラウザサポート

投稿時点では、Android用のUCブラウザとOpera Mini しない support locale options parameters。 https://caniuse.com/#search=localeCompare をチェックして、最新の情報を確認してください。

15
jay

私は最近大文字小文字を区別しない文字列ヘルパーを提供するマイクロライブラリを作成しました: https://github.com/nickuraltsev/ignore-case 。 (それは内部的にtoUpperCaseを使います。)

var ignoreCase = require('ignore-case');

ignoreCase.equals('FOO', 'Foo'); // => true
ignoreCase.startsWith('foobar', 'FOO'); // => true
ignoreCase.endsWith('foobar', 'BaR'); // => true
ignoreCase.includes('AbCd', 'c'); // => true
ignoreCase.indexOf('AbCd', 'c'); // => 2
11
Nick Uraltsev

不等式の方向を気にしている場合(おそらくリストをソートしたい場合)、大文字と小文字の変換を行う必要があります。Unicodeよりも小文字のほうが大文字のtoLowerCaseを使用するのがおそらく最適です。

function my_strcasecmp( a, b ) 
{
    if((a+'').toLowerCase() > (b+'').toLowerCase()) return 1  
    if((a+'').toLowerCase() < (b+'').toLowerCase()) return -1
    return 0
}

Javascriptは文字列の比較にロケール "C"を使っているように見えるので、文字列にASCII以外の文字が含まれている場合、結果の順序は醜くなります。弦の詳細な検査をしなければ、それについてできることはあまりありません。

10
Jasen

文字列変数needleから文字列変数haystackを見つけたいとします。 3つの落とし穴があります。

  1. 国際化されたアプリケーションはstring.toUpperCasestring.toLowerCaseを避けるべきです。代わりに大文字と小文字を区別しない正規表現を使用してください。たとえば、var needleRegExp = new RegExp(needle, "i");の後にneedleRegExp.test(haystack)が続きます。
  2. 一般的に、needleの値がわからない場合があります。 needleが正規表現 特殊文字 を含まないように注意してください。 needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");を使ってこれらをエスケープします。
  3. 大文字小文字を無視してneedlehaystackを正確に一致させたい場合は、正規表現コンストラクタの先頭に"^"を、最後に"$"を必ず追加してください。

ポイント(1)と(2)を考慮に入れると、例は次のようになります。

var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
if (result) {
    // Your code here
}
7
Chris Chute

ここにたくさんの答えがありますが、私はString libを拡張することに基づく解決策を追加したいです。

String.prototype.equalIgnoreCase = function(str)
{
    return (str != null 
            && typeof str === 'string'
            && this.toUpperCase() === str.toUpperCase());
}

このようにして、Javaで使うのと同じように使うことができます。

例:

var a = "hello";
var b = "HeLLo";
var c = "world";

if (a.equalIgnoreCase(b)) {
    document.write("a == b");
}
if (a.equalIgnoreCase(c)) {
    document.write("a == c");
}
if (!b.equalIgnoreCase(c)) {
    document.write("b != c");
}

出力は以下のようになります。

"a == b"
"b != c"
String.prototype.equalIgnoreCase = function(str) {
  return (str != null &&
    typeof str === 'string' &&
    this.toUpperCase() === str.toUpperCase());
}


var a = "hello";
var b = "HeLLo";
var c = "world";

if (a.equalIgnoreCase(b)) {
  document.write("a == b");
  document.write("<br>");
}
if (a.equalIgnoreCase(c)) {
  document.write("a == c");
}
if (!b.equalIgnoreCase(c)) {
  document.write("b != c");
}
4
Nebulosar

大文字と小文字を区別しないで比較する方法は2つあります。

  1. 文字列を大文字に変換してから、厳密演算子(===)を使用してそれらを比較します。どのように厳格な演算子がオペランドを扱うのか: http://www.thesstech.com/javascript/relational-logical-operators
  2. 文字列メソッドを使用したパターンマッチング

大文字と小文字を区別しない検索には、 "search"文字列メソッドを使用してください。検索やその他の文字列メソッドについては、次のURLを参照してください。 http://www.thesstech.com/pattern-matching-using-string-methods

<!doctype html>
  <html>
    <head>
      <script>

        // 1st way

        var a = "Apple";
        var b = "Apple";  
        if (a.toUpperCase() === b.toUpperCase()) {
          alert("equal");
        }

        //2nd way

        var a = " Null and void";
        document.write(a.search(/null/i)); 

      </script>
    </head>
</html>
4
Sohail Arif
str = 'Lol', str2 = 'lOl', regex = new RegExp('^' + str + '$', 'i');
if (regex.test(str)) {
    console.log("true");
}
3
Parth Raval

文字列の一致または比較にはRegExを使用してください。

JavaScriptでは、文字列比較にmatch()を使用できます。RegExにiを入れることを忘れないでください。

例:

var matchString = "Test";
if (matchString.match(/test/i)) {
  alert('String matched');
}
else {
 alert('String not matched');
}
2
Om Sharma

例外をスローしないで、遅い正規表現を使わないのはどうですか。

return str1 != null && str2 != null 
    && typeof str1 === 'string' && typeof str2 === 'string'
    && str1.toUpperCase() === str2.toUpperCase();

上記のスニペットは、どちらかの文字列がnullまたは未定義の場合には一致させたくないと仮定しています。

Null/undefinedに一致させたい場合は、

return (str1 == null && str2 == null)
    || (str1 != null && str2 != null 
        && typeof str1 === 'string' && typeof str2 === 'string'
        && str1.toUpperCase() === str2.toUpperCase());

何らかの理由で未定義vs nullが気になる場合:

return (str1 === undefined && str2 === undefined)
    || (str1 === null && str2 === null)
    || (str1 != null && str2 != null 
        && typeof str1 === 'string' && typeof str2 === 'string'
        && str1.toUpperCase() === str2.toUpperCase());
2
Ben Wilde

この質問でさえすでに答えています。大文字と小文字を区別しないでRegExpとmatchを使用する方法は異なります。私のリンクを見てください https://jsfiddle.net/marchdave/7v8bd7dq/27/

$("#btnGuess").click(guessWord);

  function guessWord() {

   var letter = $("#guessLetter").val();
   var Word = 'ABC';
   var pattern = RegExp(letter, 'gi'); // pattern: /a/gi

   var result = Word.match(pattern);
   alert('Ignore case sensitive:' + result);

  }
2
David S Lee

私は拡張子を書きました。非常に些細な

if (typeof String.prototype.isEqual!= 'function') {
    String.prototype.isEqual = function (str){
        return this.toUpperCase()==str.toUpperCase();
     };
}
2
KhanSharp

両方の文字列が同じ既知のロケールである場合は、次のように Intl.Collator objectを使用します。

function equalIgnoreCase(s1: string, s2: string) {
    return new Intl.Collator("en-US", { sensitivity: "base" }).compare(s1, s2) === 0;
}

明らかに、効率を上げるためにCollatorをキャッシュしたいと思うかもしれません。

このアプローチの利点は、RegExpsを使用するよりもはるかに高速である必要があり、非常にカスタマイズ可能な(上記の記事のlocalesおよびoptionsコンストラクタパラメータの説明を参照)一連の即使用可能な照合器に基づいていることです。

1

RegExpを使用するための簡単なコードスニペットが明らかに答えがないので、これが私の試みです。

function compareInsensitive(str1, str2){ 
  return typeof str1 === 'string' && 
    typeof str2 === 'string' && 
    new RegExp("^" + str1.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "$", "i").test(str2);
}

いくつかの利点があります。

  1. パラメータの種類を検証します(たとえば、undefinedのような文字列でないパラメータは、str1.toUpperCase()のような式をクラッシュさせます)。
  2. 考えられる国際化の問題に悩まされていません。
  3. RegExp文字列をエスケープします。
1
Ohad Schneider

両方をlowに変換し(パフォーマンス上の理由から一度だけ)、それらを単一行で三項演算子と比較します。

function strcasecmp(s1,s2){
    s1=(s1+'').toLowerCase();
    s2=(s2+'').toLowerCase();
    return s1>s2?1:(s1<s2?-1:0);
}
0
Luca C.