忽略重音的Java字符串搜索
我正在尝试为我的应用程序编写一个过滤函数,该函数将获取一个输入字符串,并过滤掉以某种方式与给定输入不匹配的所有对象。最简单的方法是使用String的contains方法,即只检查对象(对象中的String变量)是否包含过滤器中指定的字符串,但这不会考虑重音 所讨论的对象基本上是人,我试图匹配的字符串是名称。例如,如果有人搜索Joao,我希望Joáo会包含在结果集中。我已经在我的应用程序中使用了Collator类来按名称排序,它工作得很好,因为它可以进行比较,也就是说,使用UK Localeá在b之前,但在a之后。但是很明显,如果你比较a和a,它不会返回0,因为它们不相等 那么,有人知道我如何才能做到这一点吗?利用和一个正则表达式来摆脱这个问题 您可以按如下方式使用:忽略重音的Java字符串搜索,java,string,localization,filter,diacritics,Java,String,Localization,Filter,Diacritics,我正在尝试为我的应用程序编写一个过滤函数,该函数将获取一个输入字符串,并过滤掉以某种方式与给定输入不匹配的所有对象。最简单的方法是使用String的contains方法,即只检查对象(对象中的String变量)是否包含过滤器中指定的字符串,但这不会考虑重音 所讨论的对象基本上是人,我试图匹配的字符串是名称。例如,如果有人搜索Joao,我希望Joáo会包含在结果集中。我已经在我的应用程序中使用了Collator类来按名称排序,它工作得很好,因为它可以进行比较,也就是说,使用UK Localeá在b
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;
}