如何在JavaScript中进行不区分大小写的字符串比较?
发布于 2010-01-27 00:09:24
最简单的方法(如果您不担心特殊的Unicode字符)是调用toUpperCase
var areEqual = string1.toUpperCase() === string2.toUpperCase();发布于 2010-01-27 00:19:24
:这个答案最初是9年前添加的。现在,您应该使用带有sensitivity: 'accent'选项的localeCompare:
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' }告诉localeCompare()将相同基本字母的两个变体视为相同,除非它们具有不同的口音(如上面的第三个示例所示)。
或者,您也可以使用{ sensitivity: 'base' },只要两个字符的基本字符相同,它就会将这两个字符视为等效字符(因此,A将被视为与á等效)。
请注意,localeCompare的第三个参数在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(),因为它们并不能在所有语言中提供准确的、不区分大小写的比较。
http://www.i18nguy.com/unicode/turkish-i18n.html
发布于 2018-06-24 06:36:14
正如在最近的评论中所说,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是单独的基本字母
敏感度选项

浏览器支持
截至发帖时,适用于Android和Opera Mini的UC浏览器不支持区域设置和选项参数。请查看https://caniuse.com/#search=localeCompare以获取最新信息。
https://stackoverflow.com/questions/2140627
复制相似问题