代码之家  ›  专栏  ›  技术社区  ›  DaveJohnston

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

  •  29
  • DaveJohnston  · 技术社区  · 14 年前

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

    所讨论的对象基本上是人,我试图匹配的字符串是名称。例如,如果有人搜索jo o,我希望jo_o包含在结果集中。我已经使用了应用程序中的collator类按名称排序,它工作得很好,因为它可以进行比较,也就是说,使用UK区域设置“早于B,后于A”。但显然,如果比较A和“195”,它不会返回0,因为它们不相等。

    有人知道我怎么做吗?

    3 回复  |  直到 7 年前
        1
  •  77
  •   BalusC    14 年前

    利用 java.text.Normalizer 还有一杯Regex来摆脱 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
    
        2
  •  4
  •   Benny Bottema    8 年前

    校对器 返回0表示a和, 如果 将其配置为忽略音调符号:

    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;
    }
    

    伊萨姆(“A”,“”)现在就变成了现实。

        3
  •  0
  •   mehdok    7 年前

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

    DiacriticInsensitiveSearch.java