288

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」にあるものではなく、searchstringが検索されます(次の例は機能しません)。

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

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

4

12 に答える 12

387

ええ、ではなく、を使用.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');
}
于 2008-10-07T09:16:21.230 に答える
192

交換

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

var result= string.search(new RegExp(searchstring, "i"));
于 2008-10-07T09:41:00.790 に答える
41

より複雑な正規表現ではなく文字列を検索するだけの場合は、 - を使用できますが、大文字と小文字が区別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);

または一行で:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
于 2008-10-07T13:16:05.223 に答える
24

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

  1. 国際化されたアプリケーションでは、 and を避ける必要がstring.toUpperCaseありstring.toLowerCaseます。代わりに、大文字と小文字を区別しない正規表現を使用してください。たとえば、var needleRegExp = new RegExp(needle, "i");その後にneedleRegExp.test(haystack).
  2. 一般に、 の値がわからない場合がありますneedleには正規表現の特殊文字needleが含まれていないことに注意してください。を使用してこれらをエスケープします。needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  3. needleそれ以外の場合で、大文字と小文字を区別せずにandを正確に一致させたい場合は、正規表現コンストラクターの先頭と末尾に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);
于 2016-07-01T17:56:09.523 に答える
2

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

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
于 2010-08-24T19:11:57.910 に答える
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);
于 2016-07-12T00:51:22.353 に答える
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>
    
于 2015-06-23T11:16:03.067 に答える
-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 );

            }
        } 
于 2014-12-03T12:48:07.810 に答える