Java字符串搜索忽略重音

标签 java string localization filter diacritics

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

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

那么有没有人知道我是如何做到这一点的?

最佳答案

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

关于Java字符串搜索忽略重音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397804/

相关文章:

c# - System.String 不会重载运算符 += 但字符串连接有效,如何?

python - 是否可以找到或匹配两个具有不同特殊字符的名称django

java - 命令行 java、文件参数和管道输入

java - 描述这棵树的最佳方式,如 UML 中的多项选择题/答案算法

c++ - 在 while 循环中使用 Module32Next() 时比较 wchar_t

Django makemessages 用于站点包中的应用程序

asp.net - 如何运行 ASP.NET 5 MVC 6 rc2 的本地化示例

java - 在Android中为OpenGL ES从位图创建纹理

java - RMI服务运行方式与socket类似

mysql - 选择包含子字符串的 MySQL 字段