Java 字符串搜索忽略重音符号

2022-09-01 04:50:20

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

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

那么有没有人知道我怎么能做到这一点呢?


答案 1

利用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

答案 2

排序规则器确实为 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