JavaScriptで大文字と小文字を区別しない文字列比較を実行する方法
これを行う最も簡単な方法は(特殊なUnicode文字を心配していない場合)、toUpperCase
を呼び出すことです。
var areEqual = string1.toUpperCase() === string2.toUpperCase();
_ edit _ :この回答はもともと9年前に追加されました今日は localeCompare
をsensitivity: '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()
を使用しないでください。すべての言語で大文字と小文字が区別されない正確な比較が提供されないからです。
正規表現の助けを借りても私たちは達成することができます。
(/keyword/i).test(source)
/i
は大文字と小文字を区別しないためです。必要でなければ、大文字と小文字を区別しないNOTマッチを無視してテストできます。
(/keyword/).test(source)
大文字小文字の区別はロケール固有の操作です。シナリオによっては、それを考慮に入れることをお勧めします。たとえば、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;
}
最近のコメントで述べたように、 string::localCompare
は大文字と小文字を区別しない(他の強力なものの中でも)比較をサポートします。
これは簡単な例です
'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // returns 0
そしてあなたが使うことができる一般的な関数
function equalsIgnoringCase(text, other) {
text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}
undefined
の代わりに、おそらくあなたが作業している特定のロケールを入力するべきです。 MDNドキュメントに示されているように、これは重要です。
スウェーデン語では、äとaは別々の基本文字です。
投稿時点では、Android用のUCブラウザとOpera Mini しない support locale と options parameters。 https://caniuse.com/#search=localeCompare をチェックして、最新の情報を確認してください。
私は最近大文字小文字を区別しない文字列ヘルパーを提供するマイクロライブラリを作成しました: 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
不等式の方向を気にしている場合(おそらくリストをソートしたい場合)、大文字と小文字の変換を行う必要があります。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以外の文字が含まれている場合、結果の順序は醜くなります。弦の詳細な検査をしなければ、それについてできることはあまりありません。
文字列変数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);
if (result) {
// Your code here
}
ここにたくさんの答えがありますが、私は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");
}
大文字と小文字を区別しないで比較する方法は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>
str = 'Lol', str2 = 'lOl', regex = new RegExp('^' + str + '$', 'i');
if (regex.test(str)) {
console.log("true");
}
文字列の一致または比較にはRegExを使用してください。
JavaScriptでは、文字列比較にmatch()
を使用できます。RegExにi
を入れることを忘れないでください。
例:
var matchString = "Test";
if (matchString.match(/test/i)) {
alert('String matched');
}
else {
alert('String not matched');
}
例外をスローしないで、遅い正規表現を使わないのはどうですか。
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());
この質問でさえすでに答えています。大文字と小文字を区別しないで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);
}
私は拡張子を書きました。非常に些細な
if (typeof String.prototype.isEqual!= 'function') {
String.prototype.isEqual = function (str){
return this.toUpperCase()==str.toUpperCase();
};
}
両方の文字列が同じ既知のロケールである場合は、次のように 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
コンストラクタパラメータの説明を参照)一連の即使用可能な照合器に基づいていることです。
RegExp
を使用するための簡単なコードスニペットが明らかに答えがないので、これが私の試みです。
function compareInsensitive(str1, str2){
return typeof str1 === 'string' &&
typeof str2 === 'string' &&
new RegExp("^" + str1.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "$", "i").test(str2);
}
いくつかの利点があります。
undefined
のような文字列でないパラメータは、str1.toUpperCase()
のような式をクラッシュさせます)。RegExp
文字列をエスケープします。両方をlowに変換し(パフォーマンス上の理由から一度だけ)、それらを単一行で三項演算子と比較します。
function strcasecmp(s1,s2){
s1=(s1+'').toLowerCase();
s2=(s2+'').toLowerCase();
return s1>s2?1:(s1<s2?-1:0);
}