不区分大小写的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进行更详细的检查,没有太多可以做的事情。
有两种不区分大小写的比较方法:
- 将string转换为大写,然后使用严格运算符(
===
)比较它们。 如何严格的操作符对待操作数阅读: http : //www.thesstech.com/javascript/relational-logical-operators - 使用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
假设我们想在stringvariableshaystack
findstringvariablesneedle
。 有三个陷阱:
- 国际化的应用程序应该避免
string.toUpperCase
和string.toLowerCase
。 使用正则expression式来代替大小写。 例如,var needleRegExp = new RegExp(needle, "i");
接着needleRegExp.test(haystack)
。 - 一般来说,你可能不知道
needle
的价值。 注意needle
不包含任何正则expression式的特殊字符 。 使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
。 - 在其他情况下,如果要精确匹配
needle
和haystack
,只需忽略大小写,请确保在开始处添加"^"
,在正则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); }
它有几个优点:
- validation参数types(任何非string参数,
str1.toUpperCase()
undefined
,例如,会崩溃像str1.toUpperCase()
)的expression式。 - 不会受到可能的国际化问题的影响。
- 转义
RegExp
string。
如何不抛出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(); }; }