如何在 JavaScript 中执行不区分大小写的字符串比较?
如何进行不区分大小写的字符串比较?
最简单的方法(如果您不担心特殊的 Unicode 字符)是调用toUpperCase
:
var areEqual = string1.toUpperCase() === string2.toUpperCase();
编辑:这个答案最初是在 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
它就会将两个字符视为等效(因此将被视为等效于á
)。
请注意,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 中进行不区分大小写的比较的最佳方法是使用match()
带有i
标志的RegExp方法。
当被比较的两个字符串都是变量(不是常量)时,它会稍微复杂一些,因为您需要从字符串生成一个 RegExp,但是如果字符串具有特殊的正则表达式,将字符串传递给 RegExp 构造函数可能会导致不正确的匹配或失败的匹配其中的字符。
如果您关心国际化,请不要使用toLowerCase()
或toUpperCase()
因为它没有在所有语言中提供准确的不区分大小写的比较。
正如最近的评论中所说,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以获取最新信息。
更新:
根据评论,先前的答案检查source contains keyword
, 以使其相等检查添加^
和$
。
(/^keyword$/i).test(source)
借助正则表达式我们也可以实现。
(/keyword/i).test(source)
/i
用于忽略大小写。如果没有必要,我们可以忽略并测试不区分大小写的匹配,例如
(/keyword/).test(source)
请记住,大小写是特定于语言环境的操作。根据您的情况,您可能希望将其考虑在内。例如,如果您正在比较两个人的姓名,您可能需要考虑语言环境,但如果您正在比较机器生成的值(如 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;
}