如何过滤Java String以仅获取字母字符?

时间:2015-06-11 11:54:25

标签: java regex string

我正在生成一个XML文件来进行付款,我对用户的全名有一个约束。那个参数只接受字母字符(a-ZAZ)+空格来分隔名字和姓氏。

我无法以简单的方式过滤这个,我如何构建正则表达式或过滤器以获得我想要的输出?

示例:

'Carmen López-Delina Santos'必须为'Carmen LopezDelina Santos'

我需要用单个元音转换带有装饰的元音,如下所示:á> a,à> a,â;一个,等等;并删除点,连字符等特殊字符

谢谢!

2 个答案:

答案 0 :(得分:14)

您可以先使用a Normalizer,然后删除不需要的字符:

String input = "Carmen López-Delina Santos";
String withoutAccent = Normalizer.normalize(input, Normalizer.Form.NFD);
String output = withoutAccent.replaceAll("[^a-zA-Z ]", "");
System.out.println(output); //prints Carmen LopezDelina Santos

请注意,这可能不适用于任何语言的所有和非ascii字母 - 如果遇到这种情况,该字母将被删除。其中一个例子是土耳其语i

在这种情况下的替代方案可能是列出所有可能的字母及其替代品......

答案 1 :(得分:1)

您可以使用此removeAccents方法,将replaceAll[^A-Za-z ]一起使用:

public static String removeAccents(String text) {
  return text == null ? null :
    Normalizer.normalize(text, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
  

Normalizer将原始字符分解为组合   一个基本字符和变音符号(这可能是多个符号   用不同的语言)。 áéí具有相同的符号:0301 for   标记'重音。

     

\p{InCombiningDiacriticalMarks}+正则表达式将匹配所有   这样的变音符代码,我们将用空字符串替换它们。

在来电者中:

String original = "Carmen López-Delina Santos";
String res = removeAccents(original).replaceAll("[^A-Za-z ]", "");
System.out.println(res);

请参阅IDEONE demo