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


272

JavaScriptで2つの文字列を使用して、大文字と小文字を区別しない検索を実行しようとしています。

通常は次のようになります。

var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);

/iフラグは、大文字と小文字を区別しないためであろう。

しかし、2番目の文字列を検索する必要があります。フラグがなければ完璧に動作します:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);

/i上記の例にフラグを追加すると、変数「searchstring」にあるものではなく、検索文字列が検索されます(次の例は機能しません)。

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);

どうすればこれを達成できますか?

回答:


373

ええ、.matchではなくを使用してください.search.match呼び出しの結果は、それ自体が一致した実際の文字列を返しますが、それでもブール値として使用できます。

var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';

if (result){
    alert('Matched');
}

このような正規表現を使用することは、おそらくJavaScriptでこれを行うための整然とした最も明白な方法ですが、正規表現であるため、正規表現のメタ文字を含めることができます。文字列を他の場所(ユーザー入力など)から取得する場合、または多くのメタ文字をエスケープする必要がないようにする場合は、おそらく次のindexOfように使用するのが最適です。

matchString = 'best';
// If the match string is coming from user input you could do
// matchString = userInput.toLowerCase() here.

if (string.toLowerCase().indexOf(matchString) != -1){
    alert('Matched');
}

9
最初の例では、どうすれば「最高」を変数に変換できますか?string.match(/best/i);
Doug Molineux、2015年

5
.matchブール比較に使用する理由。最初の結果を超えて検索します。あなたはどちら.testか最初に一致した後に停止する必要があり.searchます。ここでパフォーマンスを確認してください。
Rami

toLowerCaseトルコのテスト(moserware.com/2008/02/does-your-code-pass-turkey-test.html)および同様のケース変換の問題に失敗する可能性が最も高いでしょう。どのようにReGex処理するかはわかりませんが、推測しなければならない場合は、もっとよく言うと思います。
Ohad Schneider

3
@DougMolineux RegExpオブジェクトコンストラクターを使用できます。 var text = "best"; var exp = new RegExp(test, "i");。これはと同じ/best/iです。
Medeni Baykal

174

交換する

var result= string.search(/searchstring/i);

var result= string.search(new RegExp(searchstring, "i"));

7
予期しない正規表現のメタ文字から保護するための対策が必要になるため、これはかなり厄介な方法です。
ダン

35
ダン、私の答えはあなたから-1に値するに値すると思います。JavaScriptの不適切な使用を修正することにより、ChrisBoを助けようとしました。つまり、次のとおりです。var result = string.search(/ searchstring / i); 変数searchstringが彼の意図した方法で使用された適切なものに。
Sergey Ilinsky、2008年

8
ダンの権利(おそらく「対策なし」と言うs = 'a[b'; r = new RegExp(s)
つもりでしたが

39

より複雑な正規表現ではなく文字列を検索するだけであれば、使用できますindexOf()が、大文字と小文字indexOf()が区別されるため、最初に両方の文字列を小文字にしてください。

var string="Stackoverflow is the BEST"; 
var searchstring="best";

// lowercase both strings
var lcString=string.toLowerCase();
var lcSearchString=searchstring.toLowerCase();

var result = lcString.indexOf(lcSearchString)>=0;
alert(result);

または1行で:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;

24

文字列変数needleで文字列変数を検索するとしますhaystack。3つの落とし穴があります。

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

ポイント(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);
alert(result);

4

ES6 +:

let string="Stackoverflow is the BEST";
let searchstring="best";


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());

includes()リターンtrue場合searchStringが表示されます1つ以上の位置で、またはfalseそれ以外の場合は。


2

「終了していない文字クラス」のケースが心配な場合は、英数字以外の文字をすべて削除すると役立ちます。

searchstring = searchstring.replace(/ [^ a-zA-Z 0-9] + / g、 '');

2

私は@ CHR15TOの回答が好きです。他の同様の質問で見た他の回答とは異なり、その回答は実際に、ユーザーが指定した検索文字列を適切にエスケープする方法を示しています(方法を示さない必要があると言うのではなく)。

しかし、それはまだかなり不格好で、おそらく比較的遅いです。それでは、なぜコーダーの一般的な要件である可能性が高いものに特定のソリューションがないのですか?(そして、なぜそれをES6 API BTWに含めないのですか?)

同様の質問に対する私の回答[ https://stackoverflow.com/a/38290557/887092]は、次のことを可能にします。

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);

1

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

  1. 文字列を大文字に変換してから、厳密な演算子(===)を使用してそれらを比較します。厳密な演算子がオペランドを処理する方法は、http//www.thesstech.com/javascript/relational-logical-operatorsの資料を 参照してください。

  2. 文字列メソッドを使用したパターンマッチング:

    大文字と小文字を区別しない検索には、「検索」文字列メソッドを使用します。検索およびその他の文字列メソッドについては、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>

1

私はこれを頻繁に行い、可変引数を受け入れる単純な5行のプロトタイプを使用します。それは、高速かつ作品どこでも

myString.containsIgnoreCase('red','orange','yellow')

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ANY of the arguments is contained in the string
 */
String.prototype.containsIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
      return true
    }
  }
  return false
}

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ALL of the arguments are contained in the string
 */
String.prototype.containsAllIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
      return false
    }
  }
  return true
}

// Unit test

let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
FOO BAR
`

let data = [
  'foo',
  'Foo',
  'foobar',
  'barfoo',
  'first',
  'second'
]

let result
data.forEach(item => {
  console.log('Searching for', item)
  result = content.containsIgnoreCase(item)
  console.log(result ? 'Found' : 'Not Found')
})

console.log('Searching for', 'x, y, foo')
result = content.containsIgnoreCase('x', 'y', 'foo');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar, foobar')
result = content.containsAllIgnoreCase('foo', 'bar', 'foobar');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar')
result = content.containsAllIgnoreCase('foo', 'bar');
console.log(result ? 'Found' : 'Not Found')


0

すべてを小文字にすることができます:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= (string.toLowerCase()).search((searchstring.toLowerCase()));
alert(result);

-1

ユーザーがテキストの文字列を入力したが、オートコンプリートオプションを選択せず​​に入力を終了した場合、文字列が配列内の文字列と一致しても、非表示の入力に値が設定されないことに気付きました。だから、他の答えの助けを借りて、私はこれを作りました:

var $local_source = [{
        value: 1,
        label: "c++"
    }, {
        value: 2,
        label: "java"
    }, {
        value: 3,
        label: "php"
    }, {
        value: 4,
        label: "coldfusion"
    }, {
        value: 5,
        label: "javascript"
    }, {
        value: 6,
        label: "asp"
    }, {
        value: 7,
        label: "ruby"
    }];
    $('#search-fld').autocomplete({
        source: $local_source,
        select: function (event, ui) {
            $("#search-fld").val(ui.item.label); // display the selected text
            $("#search-fldID").val(ui.item.value); // save selected id to hidden input
            return false;
        },
        change: function( event, ui ) {

            var isInArray = false;

            $local_source.forEach(function(element, index){

                if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) {
                    isInArray = true;
                    $("#search-fld").val(element.label); // display the selected text
                    $("#search-fldID").val(element.value); // save selected id to hidden input
                    console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value);
                };

            });

            if(!isInArray){

                $("#search-fld").val(''); // display the selected text
                $( "#search-fldID" ).val( ui.item? ui.item.value : 0 );

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