如何使字符串比较不区分大小写?

我创建了一个 Java 程序来比较两个字符串:

String str = "Hello";


if (str.equals("hello")) {
System.out.println("match");
} else {
System.out.println("no match");
}

这是区分大小写的,我怎么才能改变它呢?

310974 次浏览

最好的方法是使用 str.equalsIgnoreCase("foo")。它是专门为此目的而优化的。

在与 equals进行比较之前,还可以将这两个字符串转换为大写或小写。对于其他可能没有 equalsIgnoreCase等价物的语言来说,这是一个有用的技巧。

str.toUpperCase().equals(str2.toUpperCase())

如果您使用的是非罗马字母表,请注意 equalsIgnoreCase的 JavaDoc 的这一部分

请注意,此方法 < strong > 没有考虑 locale,而是将 对于某些地区,结果不令人满意 class provides locale-sensitive comparison.

你可以使用 equalsIgnoreCase

关于字符串的更多信息可以在 字符串类字符串教程中找到

必须使用 String对象的 compareToIgnoreCase方法。

int compareValue = str1.compareToIgnoreCase(str2);

意思是 str1等于 str2

请注意,在执行. equals 或. equalsIgnoreCase 之前,可能还需要对它们执行 null 检查。

空字符串对象不能调用等于方法。

即:

public boolean areStringsSame(String str1, String str2)
{
if (str1 == null && str2 == null)
return true;
if (str1 == null || str2 == null)
return false;


return str1.equalsIgnoreCase(str2);
}

在默认的 JavaAPI 中,您有:

String.CASE_INSENSITIVE_ORDER

因此,如果使用具有排序数据结构的字符串,则不需要重写比较器。

String s = "some text here";
s.equalsIgnoreCase("Some text here");

是在自己的代码中进行纯相等检查所需的内容。

只是为了进一步了解有关 Java 中字符串相等性的信息。Java.lang 的 hashCode ()函数。字符串类“区分大小写”:

public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;


for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

因此,如果你想使用 Hashtable/HashMap 作为字符串的键,并且像“ Some Key”、“ SOMEKEY”和“ some key”这样的键被看作是相等的,那么你将不得不把你的字符串包装在另一个类中(你不能扩展 String,因为它是最终类)。例如:

private static class HashWrap {
private final String value;
private final int hash;


public String get() {
return value;
}


private HashWrap(String value) {
this.value = value;
String lc = value.toLowerCase();
this.hash = lc.hashCode();
}


@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o instanceof HashWrap) {
HashWrap that = (HashWrap) o;
return value.equalsIgnoreCase(that.value);
} else {
return false;
}
}


@Override
public int hashCode() {
return this.hash;
}
}

然后像这样使用它:

HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();
public boolean newEquals(String str1, String str2)
{
int len = str1.length();
int len1 = str2.length();
if(len==len1)
{
for(int i=0,j=0;i<str1.length();i++,j++)
{
if(str1.charAt(i)!=str2.charAt(j))
return false;
}`enter code here`
}
return true;
}
import java.lang.String; //contains equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";


if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}

现在它将输出: hai

对于不区分大小写的字符串比较,String.equalsIgnoreCase 是最实用的选择。

然而,值得注意的是,这种方法既不执行完整的大小写折叠,也不执行分解,因此 cannot perform caseless matching as specified in the Unicode standard.实际上,JDK API 不提供对大小写折叠字符数据信息的访问,所以这项工作最好委托给一个经过尝试和测试的第三方库。

这个库是 重症监护室,下面是如何实现不区分大小写的字符串比较实用程序:

import com.ibm.icu.text.Normalizer2;


// ...


public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
return normalizer.normalize(s).equals(normalizer.normalize(t));
}
    String brook = "flu\u0308ßchen";
String BROOK = "FLÜSSCHEN";


assert equalsIgnoreCase(brook, BROOK);

与大写或小写字符串上的 String.equalsIgnoreCaseString.equals进行天真的比较,即使是这个简单的测试也会失败。

(不过请注意,预定义的情况下折叠风味 getNFKCCasefoldInstance是独立于区域设置的; 对于土耳其语区域设置多一点涉及 UCharacter.foldCase的工作可能是必要的。)

为了保证零安全,可以使用

org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)

或者

org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)