不区分大小写的JavaScriptstring比较

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

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

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

在JavaScript中进行不区分大小写的比较的最好方法是使用带有“i”标志的RegExp match()方法。

JavaScript:不区分大小写的search

当两个被比较的string是variables(而不是常量)时,则会更复杂一些,因为您需要从string生成RegExp,但是将该string传递给RegExp构造函数可能会导致匹配不正确或匹配失败,如果string有特殊的正则expression式在它的字符。

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

http://www.i18nguy.com/unicode/turkish-i18n.html

编辑 :这个答案是7岁。 今天你应该使用localeCompare

请记住,套pipe是特定于语言环境的操作。 根据情况,您可能需要考虑这一点。 例如,如果您要比较两个人的姓名,则可能需要考虑区域设置,但如果您比较机器生成的值(如UUID),则可能不会。 这就是为什么我在我的utils库中使用下面的函数(请注意,性能原因不包括types检查)。

 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; } 

在正则expression式的帮助下,我们也可以实现。

 (/keyword/i).test(source) 

/i是无视情况。 如果没有必要,我们可以忽略和testing不区分大小写的匹配

 (/keyword/).test(source) 

如果你关心不平等的方向(也许你想sorting一个列表),你必须进行大小写转换,而且在unicode中有更多的小写字符比toLowerCase可能是最好的转换。

 function my_strcasecmp( a, b ) { if((a+'').toLowerCase() > (b+'').toLowerCase()) return 1 if((a+'').toLowerCase() < (b+'').toLowerCase()) return -1 return 0 } 

JavaScript似乎使用语言环境“C”进行string比较,所以如果string包含非ASCII字母,则结果sorting将会很难看。 没有对string进行更详细的检查,没有太多可以做的事情。

有两种不区分大小写的比较方法:

  1. 将string转换为大写,然后使用严格运算符( === )比较它们。 如何严格的操作符对待操作数阅读: http : //www.thesstech.com/javascript/relational-logical-operators
  2. 使用string方法的模式匹配

使用“search”string方法进行不区分大小写的search。 请阅读http://www.thesstech.com/pattern-matching-using-string-methods了解search和其他string方法;

 <!doctype html> <html> <head> <script> // 1st way var a = "apple"; var b = "APPLE"; if (a.toUpperCase() === b.toUpperCase()) { alert("equal"); } //2nd way var a = " Null and void"; document.write(a.search(/null/i)); </script> </head> </html> 

我最近创build了一个微库,提供不区分大小写的string助手: https : //github.com/nickuraltsev/ignore-case 。 (它在内部使用toUpperCase 。)

 var ignoreCase = require('ignore-case'); ignoreCase.equals('FOO', 'Foo'); // => true ignoreCase.startsWith('foobar', 'FOO'); // => true ignoreCase.endsWith('foobar', 'BaR'); // => true ignoreCase.includes('AbCd', 'c'); // => true ignoreCase.indexOf('AbCd', 'c'); // => 2 

假设我们想在stringvariableshaystackfindstringvariablesneedle 。 有三个陷阱:

  1. 国际化的应用程序应该避免string.toUpperCasestring.toLowerCase 。 使用正则expression式来代替大小写。 例如, var needleRegExp = new RegExp(needle, "i"); 接着needleRegExp.test(haystack)
  2. 一般来说,你可能不知道needle的价值。 注意needle不包含任何正则expression式的特殊字符 。 使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  3. 在其他情况下,如果要精确匹配needlehaystack ,只需忽略大小写,请确保在开始处添加"^" ,在正则expression式构造函数的末尾添加"$"

考虑点(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 } 

即使这个问题已经回答了。 我有一个不同的方法来使用RegExp和匹配忽略大小写。 请看我的链接https://jsfiddle.net/marchdave/7v8bd7dq/27/

 $("#btnGuess").click(guessWord); function guessWord() { var letter = $("#guessLetter").val(); var word = 'ABC'; var pattern = RegExp(letter, 'gi'); // pattern: /a/gi var result = word.match(pattern); alert('Ignore case sensitive:' + result); } 

这里有很多答案,但我喜欢在扩展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) { return (str != null && typeof str === 'string' && this.toUpperCase() === str.toUpperCase()); } var a = "hello"; var b = "HeLLo"; var c = "world"; if (a.equalIgnoreCase(b)) { document.write("a == b"); document.write("<br>"); } if (a.equalIgnoreCase(c)) { document.write("a == c"); } if (!b.equalIgnoreCase(c)) { document.write("b != c"); } 
  str = 'Lol', str2 = 'lOl', regex = new RegExp('^' + str + '$', 'i'); if (regex.test(str)) { console.log("true"); } 

由于没有答案明确提供了使用RegExp的简单代码片段,下面是我的尝试:

 function compareInsensitive(str1, str2){ return typeof str1 === 'string' && typeof str2 === 'string' && new RegExp("^" + str1.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "$", "i").test(str2); } 

它有几个优点:

  1. validation参数types(任何非string参数, str1.toUpperCase() undefined ,例如,会崩溃像str1.toUpperCase() )的expression式。
  2. 不会受到可能的国际化问题的影响。
  3. 转义RegExpstring。

如何不抛出exception,而不是使用缓慢的正则expression式?

 return str1 != null && str2 != null && typeof str1 === 'string' && typeof str2 === 'string' && str1.toUpperCase() === str2.toUpperCase(); 

上面的代码片断假定你不想匹配,如果任何一个string为null或undefined。

如果你想匹配null / undefined,那么:

 return (str1 == null && str2 == null) || (str1 != null && str2 != null && typeof str1 === 'string' && typeof str2 === 'string' && str1.toUpperCase() === str2.toUpperCase()); 

如果由于某种原因你关心undefined vs null:

 return (str1 === undefined && str2 === undefined) || (str1 === null && str2 === null) || (str1 != null && str2 != null && typeof str1 === 'string' && typeof str2 === 'string' && str1.toUpperCase() === str2.toUpperCase()); 

使用regix进行string匹配或比较,

在javaScript中,你可以使用match()进行string比较,不要忘了把我放在REGIX

例如:

 var matchString = "Test" ; if(matchString.match(/test/i) ){ alert('String matched) ; }else{ alert('String not matched') ; } 

我写了一个扩展名。 非常微不足道

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