私は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);
どうすればこれを達成できますか?
そうです、.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');
}
交換する
var result= string.search(/searchstring/i);
と
var result= string.search(new RegExp(searchstring, "i"));
もっと複雑な正規表現ではなく文字列を検索するだけの場合は、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;
文字列変数needle
から文字列変数haystack
を見つけたいとします。 3つの落とし穴があります。
string.toUpperCase
とstring.toLowerCase
を避けるべきです。代わりに大文字と小文字を区別しない正規表現を使用してください。たとえば、var needleRegExp = new RegExp(needle, "i");
の後にneedleRegExp.test(haystack)
が続きます。needle
の値がわからない場合があります。 needle
には正規表現 特殊文字 が含まれていないことに注意してください。 needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
を使用してこれらをエスケープします。needle
と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);
ES6 +:
let string="Stackoverflow is the BEST";
let searchstring="best";
let found = string.toLowerCase()
.includes(searchstring.toLowerCase());
true
が1つ以上の位置にある場合はincludes()
はsearchString
を返し、それ以外の場合はfalse
を返します。
私は@ CHR15TOの答えが好きです。他の同様の質問で見た他の答えとは異なり、その答えは実際にはユーザー提供の検索文字列を適切にエスケープする方法を示しています。
しかし、それはまだかなり不格好で、そしておそらく比較的遅いです。それでは、コーダーにとって一般的な要件と思われるものに対して、具体的な解決策を見つけないでください。 (そしてなぜそれをES6 API BTWに含めないのですか?)
私の答え[ https://stackoverflow.com/a/38290557/887092] 同じような質問について=
var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);
「終端されていない文字クラス」の場合が心配な場合は、英数字以外の文字をすべて削除すると便利です。
searchstring = searchstring.replace(/ [^ a-zA-Z 0-9] +/g、 '');
私はこれを行いますしばしばそして可変引数を受け入れる簡単な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')
大文字と小文字を区別しないで比較する方法は2つあります。
文字列を大文字に変換してから、厳密演算子(===
)を使用してそれらを比較します。どのように厳格な演算子は、オペランドを扱うものを読む: http://www.thesstech.com/javascript/relational-logical-operators
文字列メソッドを使用したパターンマッチング
大文字と小文字を区別しない検索には、 "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>
すべて小文字にすることができます。
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= (string.toLowerCase()).search((searchstring.toLowerCase()));
alert(result);