如何进行不区分大小写的字符串比较?

2022-08-29 22:02:31

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


答案 1

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

var areEqual = string1.toUpperCase() === string2.toUpperCase();

答案 2

编辑:这个答案最初是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' }localeCompare()

或者,您可以使用 ,只要两个字符的基本字符相同,它就会将两个字符视为等效(因此将被视为等效)。{ sensitivity: 'base' }Aá

请注意,IE10 或更低版本或某些移动浏览器不支持 的第三个参数(请参阅上面链接的页面上的兼容性图表),因此,如果您需要支持这些浏览器,则需要某种回退:localeCompare

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中进行不区分大小写的比较的最佳方法是将RegExp方法与标志一起使用。match()i

不区分大小写的搜索

当两个被比较的字符串都是变量(而不是常量)时,那就有点复杂了,因为你需要从字符串生成一个正则表达式,但是如果字符串中有特殊的正则表达式字符,则将字符串传递给RegExp构造函数可能会导致不正确的匹配或失败的匹配。

如果您关心国际化,请不要使用,或者因为它不能在所有语言中提供准确的不区分大小写的比较。toLowerCase()toUpperCase()

http://www.i18nguy.com/unicode/turkish-i18n.html