web-dev-qa-db-ja.com

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

私は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);

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

263
Chris Boesing

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

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

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

そのような正規表現を使うことはおそらくJavaScriptでそれをするための最もきれいで最も明白な方法ですが、それを覚えておいてくださいis正規表現であり、したがって正規表現メタ文字を含むことができます。文字列を他の場所(ユーザ入力など)から取得したい場合、または多数のメタ文字をエスケープする必要を避けたい場合は、おそらく次のように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');
}
365
Dan

交換する

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

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

もっと複雑な正規表現ではなく文字列を検索するだけの場合は、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;
37
Odilon Redo

文字列変数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);
alert(result);
20
Chris Chute

ES6 +:

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


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

trueが1つ以上の位置にある場合はincludes()searchStringを返し、それ以外の場合はfalseを返します。

3
Andrey

私は@ CHR15TOの答えが好きです。他の同様の質問で見た他の答えとは異なり、その答えは実際にはユーザー提供の検索文字列を適切にエスケープする方法を示しています。

しかし、それはまだかなり不格好で、そしておそらく比較的遅いです。それでは、コーダーにとって一般的な要件と思われるものに対して、具体的な解決策を見つけないでください。 (そしてなぜそれをES6 API BTWに含めないのですか?)

私の答え[ https://stackoverflow.com/a/38290557/887092] 同じような質問について=

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

「終端されていない文字クラス」の場合が心配な場合は、英数字以外の文字をすべて削除すると便利です。

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

私はこれを行いますしばしばそして可変引数を受け入れる簡単な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')
1
Steven Spungin

大文字と小文字を区別しないで比較する方法は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>
    
1
Sohail Arif

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

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