如何在JavaScript中执行不区分大小写的字符串比较?
当前回答
这里有很多答案,但我喜欢添加一个基于扩展String库的解决方案:
String.prototype.equalIgnoreCase = function(str)
{
return (str != null
&& typeof str === 'string'
&& this.toUpperCase() === str.toUpperCase());
}
这样你就可以像在Java中那样使用它!
例子:
var a = "hello";
var b = "HeLLo";
var c = "world";
if (a.equalIgnoreCase(b)) {
document.write("a == b");
}
if (a.equalIgnoreCase(c)) {
document.write("a == c");
}
if (!b.equalIgnoreCase(c)) {
document.write("b != c");
}
输出将是:
"a == b"
"b != c"
String.prototype.equalIgnoreCase = function(str) { 返回(str != null && Typeof STR === 'string' && this.toUpperCase() === str.toUpperCase()); } Var a = "hello"; var b = "HeLLo"; Var c = "world"; if (a.equalIgnoreCase(b)) { 文档。写("a == b"); document . write(“< br > "); } if (a.equalIgnoreCase(c)) { 文档。写("a == c"); } if (!b.equalIgnoreCase(c)) { 文档。写("b != c"); }
其他回答
将两者转换为更低的字符串(出于性能原因,只进行一次),并将它们与内联三元运算符进行比较:
function strcasecmp(s1,s2){
s1=(s1+'').toLowerCase();
s2=(s2+'').toLowerCase();
return s1>s2?1:(s1<s2?-1:0);
}
记住,大小写是特定于区域设置的操作。根据具体情况,你可能需要考虑到这一点。例如,如果比较两个人的名字,可能需要考虑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;
}
如果你关心不等式的方向(也许你想排序一个列表) 你几乎必须做大小写转换,因为在unicode中小写字符比大写字符多toLowerCase可能是最好的转换。
function my_strcasecmp( a, b )
{
if((a+'').toLowerCase() > (b+'').toLowerCase()) return 1
if((a+'').toLowerCase() < (b+'').toLowerCase()) return -1
return 0
}
Javascript似乎使用locale“C”进行字符串比较,因此结果排序将 如果字符串包含非ASCII字母,则为丑陋。如果不对字符串做更详细的检查,就没有太多的事情可以做。
假设我们想要在字符串变量大海捞针。这里有三个陷阱:
国际化的应用程序应该避免字符串。toUpperCase和string.toLowerCase。请使用忽略大小写的正则表达式。例如,var needleRegExp = new RegExp(needle, "i");然后是needleRegExp.test(haystack)。 一般来说,你可能不知道针的价值。注意针头不包含任何正则表达式特殊字符。使用needle.replace(/[-[\]{}()*+?, \ \ ^ $ | # \] / g , "\\$&");. 在其他情况下,如果您想精确匹配needle和haystack,只需忽略case,请确保在正则表达式构造函数的开头添加“^”,并在末尾添加“$”。
考虑到第(1)和(2)点,一个例子是:
var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
if (result) {
// Your code here
}
这是这个答案的改进版本。
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);