【问题标题】:How to filter a Java String to get only alphabet characters?如何过滤 Java 字符串以仅获取字母字符?
【发布时间】:2015-06-11 11:54:24
【问题描述】:

我正在生成一个用于付款的 XML 文件,并且我对用户的全名有一个限制。该参数只接受字母字符 (a-ZAZ) + 空格来分隔姓名和姓氏。

我无法以简单的方式对其进行过滤,如何构建正则表达式或过滤器来获得所需的输出?

例子:

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

我需要将带有修饰的元音转换为单个元音如下:á > a、à > a、â > a 等;并删除点、连字符等特殊字符。

谢谢!

【问题讨论】:

  • ó 是如何变成o 的,顺便说一句[a-ZA-Z] 不包括ó
  • 我需要将带有修饰的元音转换为单个元音,如下所示:á > a、à > a、â > a 等等。
  • 该要求必须是您问题的一部分,而不是 cmets。也不要忘记展示你的尝试。
  • @EnriMR 也许您可以检查 ASCII 以获取特殊字符的值,然后进行范围。
  • 这似乎是您第一个需要的一个不错的答案(我喜欢 Guava 部分):stackoverflow.com/a/4283366/4167384 这用于特殊字符替换:stackoverflow.com/a/1453284/4167384

标签: java regex string


【解决方案1】:

您可以先使用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

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

【讨论】:

  • 这正是我需要的,因为系统正在等待我的 XML 文件不允许任何其他字符用于名称字段
【解决方案2】:

您可以将此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 表示 标记' 重音。

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

在调用者中:

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

IDEONE demo

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多