如何在JavaScript中执行不区分大小写的字符串比较?


当前回答

为了获得更好的浏览器兼容性,可以使用正则表达式。这将适用于过去20年发布的所有web浏览器:

String.prototype.equalsci = function(s) {
    var regexp = RegExp("^"+this.replace(/[.\\+*?\[\^\]$(){}=!<>|:-]/g, "\\$&")+"$", "i");
    return regexp.test(s);
}

"PERSON@Ü.EXAMPLE.COM".equalsci("person@ü.example.com")// returns true

这与这里找到的其他答案不同,因为它考虑到了并非所有用户都在使用现代网络浏览器。

注意:如果你需要支持不寻常的情况,如土耳其语,你将需要使用localeCompare,因为i和i在土耳其语中不是同一个字母。

"I".localeCompare("i", undefined, { sensitivity:"accent"})===0// returns true
"I".localeCompare("i", "tr", { sensitivity:"accent"})===0// returns false

其他回答

正如在最近的评论中所说,string::localeCompare支持不区分大小写的比较(以及其他强大的功能)。

这里有一个简单的例子

'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // returns 0

这是一个通用函数

function equalsIgnoringCase(text, other) {
    return text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}

请注意,您可能应该输入正在使用的特定区域,而不是undefined。这在MDN文档中很重要

在瑞典语中,ä和a是不同的基本字母

敏感性的选择

浏览器支持

截至发稿时,UC浏览器的Android和Opera Mini不支持地区和选项参数。请登录https://caniuse.com/#search=localeCompare获取最新信息。

最简单的方法(如果你不担心特殊的Unicode字符)是调用toUpperCase:

var areEqual = string1.toUpperCase() === string2.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);
}

这是这个答案的改进版本。

String.equal = function (s1, s2, ignoreCase, useLocale) {
    if (s1 == null || s2 == null)
        return false;

    if (!ignoreCase) {
        if (s1.length !== s2.length)
            return false;

        return s1 === s2;
    }

    if (useLocale) {
        if (useLocale.length)
            return s1.toLocaleLowerCase(useLocale) === s2.toLocaleLowerCase(useLocale)
        else
            return s1.toLocaleLowerCase() === s2.toLocaleLowerCase()
    }
    else {
        if (s1.length !== s2.length)
            return false;

        return s1.toLowerCase() === s2.toLowerCase();
    }
}

用途及测试:

字符串。equals = function (s1, s2, ignoreCase, uslocale) { If (s1 == null || s2 == null) 返回错误; if (!ignoreCase) { 如果(s1)。长度!== s2.length) 返回错误; 返回s1 === s2; } if (uslocale) { 如果(useLocale.length) return s1.toLocaleLowerCase(useLocale) === s2.toLocaleLowerCase(useLocale) 其他的 return s1.toLocaleLowerCase() === s2.toLocaleLowerCase() } 其他{ 如果(s1)。长度!== s2.length) 返回错误; return s1.toLowerCase() === s2.toLowerCase(); } } //如果你不介意扩展原型。 String.prototype.equal = function(string2, ignoreCase, uslocalale) { return String.equal(this.valueOf(), string2, ignoreCase, uslocalale); } // ------------------ 测试 ---------------------- console.log(“测试…”); console.log('区分大小写1'); var result = "Abc123".equal("Abc123"); 控制台。Assert (result === true); console.log('区分大小写2'); result = "aBC123".equal(" aBC123"); 控制台。Assert (result === false); console.log(忽略大小写); result = "AbC123"。平等(“aBc123”,真正的); 控制台。Assert (result === true); console.log('忽略大小写+当前语言环境'); result = "AbC123"。平等(“aBc123”,真正的); 控制台。Assert (result === true); console.log('土耳其语测试1(忽略大小写,en-US)'); result = "IiiI"。equal("ıiİI", true, "en-US"); 控制台。Assert (result === false); console.log('土耳其语测试2(忽略大小写,tr-TR)'); result = "IiiI"。equal("ıiİI", true, "tr-TR"); 控制台。Assert (result === true); console.log('土耳其语测试3(区分大小写,tr-TR)'); result = "IiiI"。equal("ıiİI", false, "tr-TR"); 控制台。Assert (result === false); console.log(“null-test-1”); result = "AAA".equal(null); 控制台。Assert (result === false); console.log(“null-test-2”); result =字符串。平等(null, " BBB "); 控制台。Assert (result === false); console.log(“null-test-3”); result =字符串。平等(空,空); 控制台。Assert (result === false);

如果两个字符串具有相同的已知区域,则可能需要使用Intl。像这样的Collator对象:

function equalIgnoreCase(s1: string, s2: string) {
    return new Intl.Collator("en-US", { sensitivity: "base" }).compare(s1, s2) === 0;
}

显然,您可能希望缓存Collator以提高效率。

这种方法的优点是,它应该比使用regexp快得多,并且基于一组非常可定制的(请参阅上一篇文章中关于区域设置和选项构造函数参数的描述)现成的排序器。