如何在JavaScript中执行不区分大小写的字符串比较?
当前回答
最简单的方法(如果你不担心特殊的Unicode字符)是调用toUpperCase:
var areEqual = string1.toUpperCase() === string2.toUpperCase();
其他回答
由于没有答案明确提供了使用RegExp的简单代码片段,下面是我的尝试:
function compareInsensitive(str1, str2){
return typeof str1 === 'string' &&
typeof str2 === 'string' &&
new RegExp("^" + str1.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "$", "i").test(str2);
}
它有几个优点:
验证参数类型(任何非字符串参数,例如undefined,都会使str1.toUpperCase()这样的表达式崩溃)。 不会出现国际化问题。 转义RegExp字符串。
将两者转换为更低的字符串(出于性能原因,只进行一次),并将它们与内联三元运算符进行比较:
function strcasecmp(s1,s2){
s1=(s1+'').toLowerCase();
s2=(s2+'').toLowerCase();
return s1>s2?1:(s1<s2?-1:0);
}
最简单的方法(如果你不担心特殊的Unicode字符)是调用toUpperCase:
var areEqual = string1.toUpperCase() === string2.toUpperCase();
如果两个字符串具有相同的已知区域,则可能需要使用Intl。像这样的Collator对象:
function equalIgnoreCase(s1: string, s2: string) {
return new Intl.Collator("en-US", { sensitivity: "base" }).compare(s1, s2) === 0;
}
显然,您可能希望缓存Collator以提高效率。
这种方法的优点是,它应该比使用regexp快得多,并且基于一组非常可定制的(请参阅上一篇文章中关于区域设置和选项构造函数参数的描述)现成的排序器。
编辑:这个答案最初是9年前添加的。现在你应该使用带有sensitivity: 'accent'选项的localeCompare:
函数ciEquals(a, b) { 返回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中进行不区分大小写比较的最好方法是使用RegExp match()方法和i标志。
不区分大小写的搜索
当两个被比较的字符串都是变量(而不是常量)时,这就有点复杂了,因为你需要从字符串中生成一个RegExp,但是如果字符串中有特殊的regex字符,将字符串传递给RegExp构造函数可能会导致不正确的匹配或失败的匹配。
如果你关心国际化,不要使用toLowerCase()或toUpperCase(),因为它不能在所有语言中提供准确的不区分大小写的比较。
http://www.i18nguy.com/unicode/turkish-i18n.html