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

#1楼

我写了一个扩展名。 非常琐碎

if (typeof String.prototype.isEqual!= 'function') {
String.prototype.isEqual = function (str){
return this.toUpperCase()==str.toUpperCase();
};
}

#2楼

借助正则表达式,我们也可以实现。

(/keyword/i).test(source)
/i用于忽略大小写。 如果没有必要,我们可以忽略并测试不区分大小写的匹配项,例如
(/keyword/).test(source)
#3楼

请记住,大小写是特定于语言环境的操作。 根据情况,您可能需要考虑这一点。 例如,如果您要比较两个人的姓名,则可能要考虑语言环境,但如果要比较计算机生成的值(例如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;
}

#4楼

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

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

#5楼

编辑 :这个答案最初是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中进行不区分大小写的比较的最佳方法是使用带有i标志的RegExp match()方法。

当两个被比较的字符串都是变量(不是常量)时,这会稍微复杂一点,因为您需要从字符串生成RegExp,但是如果字符串具有特殊的regex,则将字符串传递给RegExp构造函数可能会导致不正确的匹配或失败的匹配里面的字符。

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