从字符串中删除重音符号

woj*_*tek 6 java regex string

最近我在 StringUtils 库中发现了非常有用的方法,即

\n\n
StringUtils.stripAccents(String s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现它对于删除任何特殊字符并将其转换为某些 ASCII“等效字符”确实很有帮助,例如 \xc3\xa7=c 等。

\n\n

现在我正在为一位德国客户工作,他确实需要做这样的事情,但仅限于非德国字符。任何元音变音都应保持不变。我意识到 strinAccents 在这种情况下没有用处。

\n\n

有人对这些东西有一些经验吗?\n是否有任何有用的工具/库/类或者可能是正则表达式?\n我尝试编写一些解析和替换这些字符的类,但为所有人构建这样的映射可能非常困难语言...

\n\n

任何建议都适用...

\n

eis*_*eis 2

我的直觉告诉我,最简单的方法就是只列出允许的字符并从其他所有内容中删除重音符号。这就像

\n
import java.util.regex.*;\nimport java.text.*;\n\npublic class Replacement {\n    public static void main(String args[]) {\n        String from = "aoe\xc3\xa5\xc3\xb6\xc3\xa4\xc3\xac\xc3\xa9";\n        String result = stripAccentsFromNonGermanCharacters(from);\n        \n        System.out.println("Result: " + result);\n    }\n\n    private static String patternContainingAllValidGermanCharacters =\n                                            "a-zA-Z0-9\xc3\xa4\xc3\x84\xc3\xb6\xc3\x96\xc3\xa9\xc3\x89\xc3\xbc\xc3\x9c\xc3\x9f";\n    private static Pattern nonGermanCharactersPattern =\n        Pattern.compile("([^" + patternContainingAllValidGermanCharacters + "])");\n\n    public static String stripAccentsFromNonGermanCharacters(\n           String from) {\n        return stripAccentsFromCharactersMatching(\n            from, nonGermanCharactersPattern);\n    }\n\n    public static String stripAccentsFromCharactersMatching(\n        String target, Pattern myPattern) {\n\n        StringBuffer myStringBuffer = new StringBuffer();\n        Matcher myMatcher = myPattern.matcher(target);\n        while (myMatcher.find()) {\n            myMatcher.appendReplacement(myStringBuffer,\n                stripAccents(myMatcher.group(1)));\n        }\n        myMatcher.appendTail(myStringBuffer);\n\n        return myStringBuffer.toString();\n    }\n\n\n    // pretty much the same thing as StringUtils.stripAccents(String s)\n    // used here so I can demonstrate the code without StringUtils dependency\n    public static String stripAccents(String text) {\n        return Normalizer.normalize(text,\n            Normalizer.Form.NFD)\n           .replaceAll("\\\\p{InCombiningDiacriticalMarks}+", "");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(我意识到该模式可能不包含所需的所有字符,但添加缺少的字符)

\n