我正在生成一个XML文件来进行付款,我对用户的全名有一个约束。那个参数只接受字母字符(a-ZAZ)+空格来分隔名字和姓氏。
我无法以简单的方式过滤这个,我如何构建正则表达式或过滤器以获得我想要的输出?
示例:
'Carmen López-Delina Santos'
必须为'Carmen LopezDelina Santos'
我需要用单个元音转换带有装饰的元音,如下所示:á> a,à> a,â;一个,等等;并删除点,连字符等特殊字符
谢谢!
答案 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