JavaScript不区分大小写地比较字符串

62

我需要使用JavaScript检查一些字符串,但大小写敏感性会引起问题。例如:

if('abc'=='ABC')
{
return true;
}

虽然单词的意思相同,但它不会进入 if 循环。我也无法使用 tolower 子句,因为我不知道数据将如何出现。例如:

if('aBc'=='abC')
{
return true;
}

如何编写JS函数,如果可以使用jQuery来完成它。


1
已经回答的问题有更好的信息。我建议你(当前的读者)忽略这个页面。 - Adriano
4个回答

125

你可以将两个参数都转换为小写,这样你就能进行大小写不敏感的搜索。

var string1 = "aBc";
var string2 = "AbC";

if (string1.toLowerCase() === string2.toLowerCase())
{
    #stuff
}

2
请注意,不能盲目地将其应用于代码,因为如果两个变量都为null,则string1 == string2将返回true,如果只有一个为null,则返回false。而string1.toLowerCase() == string2.toLowerCase()将在任何一个变量为null时抛出错误。 - Russell Giddings
7
如已回答的问题所指出的,实际上你不应该使用.toLowerCase()而应该使用.toUpperCase()。请参见https://dev59.com/IXI95IYBdhLWcg3wzhd9和http://msdn.microsoft.com/en-us/library/bb386042.aspx。 - Adriano
三个等号符号?=== - Sandeep

18

另一种使用正则表达式的方法(比Zachary的答案更正确):

var string1 = 'someText',
    string2 = 'SometexT',
    regex = new RegExp('^' + string1 + '$', 'i');

if (regex.test(string2)) {
    return true;
}

RegExp.test() 将返回 true 或 false。

另外,在正则表达式开头添加 '^'(表示字符串的起始处)和在结尾处添加 '$'(表示字符串的结束处),确保你的正则表达式仅会匹配 'sometext' 是字符串 stringToTest 中唯一的文本。如果你正在寻找包含正则表达式的文本,则可以将它们省略。

使用 string.toLowerCase() 方法可能更容易一些。

所以......正则表达式功能强大,但只有当你理解它们的工作原理时才应该使用它们。如果你使用不理解的东西,可能会出现意想不到的问题。

有很多正则表达式的“教程”,但大多数似乎都在推销某种产品。这是一个看起来不错的教程......虽然它是为使用 php 写的,但它似乎是一个不错的入门教程:http://weblogtoolscollection.com/regex/regex.php

这似乎是一个测试正则表达式的好工具:http://gskinner.com/RegExr/


这个是最好的,即使它适用于null,而toUpperCase或toLowerCase会出错 - estupendo - Ali Adravi
如果string1不是有效的正则表达式模式会怎样呢? 例如 new RegExp('^(a$', 'i') - Bohdan Lyzanets
@Bohdan,我鼓励你尝试在js控制台中进行这种操作。如果你这样做,你会发现你的浏览器会抛出SyntaxError错误,所以我不认为这在这种情况下是相关的。 - Akrikos
2
距离我发布这个答案已经过去了几年。我想为后人记录一下,当我需要进行大小写不敏感的比较时,我通常会使用Gazler的toUpperCase答案的变体。正则表达式通常比其他内置方法慢。 - Akrikos

10
你也可以使用 string.match()。
var string1 = "aBc";
var match = string1.match(/AbC/i);

if(match) {
}

1
是否也可以使用另一个变量来代替/AbC/部分? - YeppThat'sMe
YeppThat'sMe:是的,你可以这样做: var string1 = "aBc", regex = /AbC/i, match = string1.match(regex); 请注意,match将是与正则表达式匹配的字符串部分,如果正则表达式没有匹配任何内容,则为null。我将发布另一种使用不同正则表达式方法来完成此操作的替代答案。 - Akrikos
5
你应该使用/^abc$/i.test("aBc"),因为在开头和结尾没有锚点的情况下,它实际上是表示包含而不是相等 - John Leidegren

5

试试这个...

if(string1.toLowerCase() == string2.toLowerCase()){
    return true;
}

此外,它不是一个循环,而是一段代码块。循环通常会重复执行(尽管可能只执行一次),而代码块永远不会重复。

我看到你的注释关于不使用 toLowerCase,但是我不明白为什么它会有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接