如何在JavaScript中执行不区分大小写的字符串比较?
当前回答
不区分大小写的比较有两种方式:
将字符串转换为大写,然后使用严格操作符(===)进行比较。 使用字符串方法进行模式匹配:
使用"search"字符串方法进行不区分大小写的搜索。
<!doctype html > < html > < >头 < >脚本 //第一种方式 Var a = "苹果"; var b = "苹果"; if (a.toUpperCase() === b.toUpperCase()) { alert("平等"); } / / 2路 var a = "无效"; document . write (a.search(/空/我)); > < /脚本 > < /头 < / html >
其他回答
更新:
根据注释,之前的答案检查源包含关键字,使其相等检查添加了^和$。
(/^keyword$/i).test(source)
借助于正则表达式也可以实现。
(/keyword/i).test(source)
/i表示忽略大小写。如果没有必要,我们可以忽略并测试not大小写敏感匹配
(/keyword/).test(source)
不区分大小写的比较有两种方式:
将字符串转换为大写,然后使用严格操作符(===)进行比较。 使用字符串方法进行模式匹配:
使用"search"字符串方法进行不区分大小写的搜索。
<!doctype html > < html > < >头 < >脚本 //第一种方式 Var a = "苹果"; var b = "苹果"; if (a.toUpperCase() === b.toUpperCase()) { alert("平等"); } / / 2路 var a = "无效"; document . write (a.search(/空/我)); > < /脚本 > < /头 < / html >
编辑:这个答案最初是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
这是这个答案的改进版本。
String.equal = function (s1, s2, ignoreCase, useLocale) {
if (s1 == null || s2 == null)
return false;
if (!ignoreCase) {
if (s1.length !== s2.length)
return false;
return s1 === s2;
}
if (useLocale) {
if (useLocale.length)
return s1.toLocaleLowerCase(useLocale) === s2.toLocaleLowerCase(useLocale)
else
return s1.toLocaleLowerCase() === s2.toLocaleLowerCase()
}
else {
if (s1.length !== s2.length)
return false;
return s1.toLowerCase() === s2.toLowerCase();
}
}
用途及测试:
字符串。equals = function (s1, s2, ignoreCase, uslocale) { If (s1 == null || s2 == null) 返回错误; if (!ignoreCase) { 如果(s1)。长度!== s2.length) 返回错误; 返回s1 === s2; } if (uslocale) { 如果(useLocale.length) return s1.toLocaleLowerCase(useLocale) === s2.toLocaleLowerCase(useLocale) 其他的 return s1.toLocaleLowerCase() === s2.toLocaleLowerCase() } 其他{ 如果(s1)。长度!== s2.length) 返回错误; return s1.toLowerCase() === s2.toLowerCase(); } } //如果你不介意扩展原型。 String.prototype.equal = function(string2, ignoreCase, uslocalale) { return String.equal(this.valueOf(), string2, ignoreCase, uslocalale); } // ------------------ 测试 ---------------------- console.log(“测试…”); console.log('区分大小写1'); var result = "Abc123".equal("Abc123"); 控制台。Assert (result === true); console.log('区分大小写2'); result = "aBC123".equal(" aBC123"); 控制台。Assert (result === false); console.log(忽略大小写); result = "AbC123"。平等(“aBc123”,真正的); 控制台。Assert (result === true); console.log('忽略大小写+当前语言环境'); result = "AbC123"。平等(“aBc123”,真正的); 控制台。Assert (result === true); console.log('土耳其语测试1(忽略大小写,en-US)'); result = "IiiI"。equal("ıiİI", true, "en-US"); 控制台。Assert (result === false); console.log('土耳其语测试2(忽略大小写,tr-TR)'); result = "IiiI"。equal("ıiİI", true, "tr-TR"); 控制台。Assert (result === true); console.log('土耳其语测试3(区分大小写,tr-TR)'); result = "IiiI"。equal("ıiİI", false, "tr-TR"); 控制台。Assert (result === false); console.log(“null-test-1”); result = "AAA".equal(null); 控制台。Assert (result === false); console.log(“null-test-2”); result =字符串。平等(null, " BBB "); 控制台。Assert (result === false); console.log(“null-test-3”); result =字符串。平等(空,空); 控制台。Assert (result === false);
记住,大小写是特定于区域设置的操作。根据具体情况,你可能需要考虑到这一点。例如,如果比较两个人的名字,可能需要考虑locale,但如果比较机器生成的值(如UUID),则可能不需要考虑locale。这就是为什么我在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;
}
推荐文章
- 在数组中获取所有选中的复选框
- 如何为Firebase构建云函数,以便从多个文件部署多个函数?
- 如何发送推送通知到web浏览器?
- AngularJS:工厂和服务?
- js:将一个组件包装成另一个组件
- 父ng-repeat从子ng-repeat的访问索引
- JSHint和jQuery: '$'没有定义
- 模仿JavaScript中的集合?
- 用JavaScript验证电话号码
- c#:如何获得一个字符串的第一个字符?
- String类中的什么方法只返回前N个字符?
- 如何在HTML5中改变视频的播放速度?
- 谷歌地图API v3:我可以setZoom后fitBounds?
- 我可以将c#字符串值转换为转义字符串文字吗?
- ES6/2015中的null安全属性访问(和条件赋值)