36

我正在尝试为我的应用程序编写一个过滤器函数,该函数将采用输入字符串并以某种方式过滤掉所有与给定输入不匹配的对象。最简单的方法是使用 String 的 contains 方法,即只检查对象(对象中的 String 变量)是否包含过滤器中指定的字符串,但这不会考虑重音符号。

有问题的对象基本上是人,而我要匹配的字符串是名称。因此,例如,如果有人搜索 Joao,我希望 Joáo 会包含在结果集中。我已经在我的应用程序中使用了 Collat​​or 类来按名称排序,它运行良好,因为它可以进行比较,即使用 UK Locale á 在 b 之前但在 a 之后。但是很明显,如果您比较 a 和 á,它不会返回 0,因为它们不相等。

那么有谁知道我怎么能做到这一点?

4

3 回答 3

96

使用java.text.Normalizer正则表达式来摆脱变音符号

public static String removeDiacriticalMarks(String string) {
    return Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

您可以按如下方式使用:

String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao
于 2010-03-07T20:27:27.980 回答
4

如果将 Collat​​or配置为忽略变音符号,Collat​​or确实为 a 和 á 返回 0 :

public boolean isSame(String a, String b) {
    Collator insenstiveStringComparator = Collator.getInstance();
    insenstiveStringComparator.setStrength(Collator.PRIMARY);
    // Collator.PRIMARY also works, but is case senstive
    return insenstiveStringComparator.compare(a, b) == 0;
}

isSame("a", "á") 现在产生 true

于 2016-10-19T13:17:16.970 回答
0

我编写了一个类,用于通过忽略变音符号(不删除它们)来搜索阿拉伯语文本。也许你可以得到这个想法或以某种方式使用它。

DiacriticInsensitiveSearch.java

于 2017-07-19T15:46:13.993 回答