忽略重音的Java字符串搜索

忽略重音的Java字符串搜索,java,string,localization,filter,diacritics,Java,String,Localization,Filter,Diacritics,我正在尝试为我的应用程序编写一个过滤函数,该函数将获取一个输入字符串,并过滤掉以某种方式与给定输入不匹配的所有对象。最简单的方法是使用String的contains方法,即只检查对象(对象中的String变量)是否包含过滤器中指定的字符串,但这不会考虑重音 所讨论的对象基本上是人,我试图匹配的字符串是名称。例如,如果有人搜索Joao,我希望Joáo会包含在结果集中。我已经在我的应用程序中使用了Collator类来按名称排序,它工作得很好,因为它可以进行比较,也就是说,使用UK Localeá在b

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

所讨论的对象基本上是人,我试图匹配的字符串是名称。例如,如果有人搜索Joao,我希望Joáo会包含在结果集中。我已经在我的应用程序中使用了Collator类来按名称排序,它工作得很好,因为它可以进行比较,也就是说,使用UK Localeá在b之前,但在a之后。但是很明显,如果你比较a和a,它不会返回0,因为它们不相等

那么,有人知道我如何才能做到这一点吗?

利用和一个正则表达式来摆脱这个问题

您可以按如下方式使用:

String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao
如果将Collator配置为忽略变音符号,则它会为andá返回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了

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


我收回我的回答!永远不要遇到java.text.Normalizer,谢谢您的提示。这很好。我试图在非ascii字符串上进行正则表达式匹配,尽管没有成功。正常化似乎是最好的办法。这是一个糟糕的答案。需要使用创建“比较强度”设置为“主”的collator对象。展示了如何从Perl的角度执行此操作。Collator不能用于在字符串中搜索,只能比较完整的字符串,在出现seatch时不起作用(除了精确匹配!)规范化器工作正常,但速度慢,适合单个值,但不要在一大组值中搜索。可能的重复项只匹配完全相同的字符串,但如果您想使用“contains”,这将不起作用。
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;
}