忽略重音的Java字符串搜索

时间:2010-03-07 20:20:40

标签: java string localization filter diacritics

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

有问题的对象基本上是人物,我想要匹配的字符串是名称。因此,例如,如果有人搜索Joao,我会期望Joáo被包含在结果集中。我已经在我的应用程序中使用Collat​​or类按名称进行排序,它运行良好,因为它可以进行比较,即使用英国语言​​环境á来自b之前,但是之后。但是,如果你比较a和á因为它们不相等,它显然不会返回0。

所以有人知道我怎么能这样做吗?

3 个答案:

答案 0 :(得分:79)

利用java.text.Normalizer和正则表达式来摆脱diacritics

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

您可以使用以下内容:

String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao

答案 1 :(得分:4)

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”,“á”)现在产生真实

答案 2 :(得分:0)

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

DiacriticInsensitiveSearch.java