【问题标题】:Regex to remove initials from full name正则表达式从全名中删除首字母
【发布时间】:2018-02-26 06:16:58
【问题描述】:

我有像“D John Livingston”、“S. Jennifer Adstan”这样的名字,我只想从名字中删除首字母、名字中的“D”和“S”。在第二个名字。我如何使用 java 正则表达式来做到这一点?

【问题讨论】:

  • 你试过了吗?
  • 你应该尝试一些东西并给出一些结果,以便我们可以纠正它,即使它是正确的。 :)
  • 简单的方法。简单的方法。搜索 String.split() 方法。
  • 中间的首字母(“James T. Kirk”)怎么样?
  • 我试过这个 "(([A-Z]){2,})" 如果我​​使用 (([A-Z]){1,}) 会删除两个连续的大写字母,我会得到 "ohn ivingston"作为输出。

标签: java regex regex-negation


【解决方案1】:

以下代码 sn-p 似乎运行良好:

String input = "John O'Connel";
input = input.replaceAll("\\b[A-Z]+(?:\\.|\\s+|$)", "").trim();
System.out.println(input);

John O'Connel

您的问题充满了极端情况,例如,首字母可能是多个字母,并且可能出现在名称的开头、中间或结尾。我使用\s*[A-Z]+(?:\.|\b) 模式替换,这似乎至少涵盖了您的示例。另外,我打电话给String#trim() 来清理开头或结尾的首字母的空白。

Demo

【讨论】:

  • "[A-Z]\\W+" 是另一种选择。任何大写字母后跟任意数量的标点符号或空格。
  • @BryanPatterson 我认为您的建议会失败,因为在这种情况下\\W+ 不会匹配。最好使用零宽度的单词边界。
  • @Tim Biegeleisen 很好。也许“[A-Z]\\W*\\b”?
  • 如果存在中间名首字母,您的正则表达式还会合并名字和姓氏吗?
  • @AshokKumar 我根据您的新要求更新了我的答案。
【解决方案2】:

为此,我会考虑使用字符串replaceAll()

那么我们如何设计正则表达式呢?

基本上你需要考虑三种情况:

  • A.名称开头的单个字母(可选句点),后跟一个 空间
  • 乙。名称末尾的单个字母(可选句点),前面有一个 空间
  • C.名称中间的单个字母(可选句点),由 两个空格

对于前两种情况,您需要不留空格。所以你会匹配一个空格并用零个空格替换它。

对于最后一种情况,您需要留一个空格。但是,您可以将其视为 A 或 B,而不是明确处理这种情况,因为它们只会替换两个空格中的一个,从而为您留下所需的空格数:1。

那么我们如何将案例 A 和案例 B 结合在一起呢?使用|的符号。

为防止从较大的字母链中抓取单个字母,您可以在未由空格字符分隔的一侧使用单词边框标记\b。 (通常对于情况 A 和 B,我会使用 ^$ 来显式匹配字符串的开头和结尾。但是,由于我们还需要处理字符串中间的情况 C,我们应该改用文字边框标记。)

我们如何表示可选期间?由于句号是特殊字符,必须转义:\. 然后用问号标记为可选:\.? 但是,仍然存在名称中间的 A. 可能匹配为just的问题 A 因为句号也算作一个单词边框。为了防止这种情况,我们在可选句点\\.?+ 中添加了所有格量词。

将所有这些放在一起,我们的正则表达式将是:(\b[A-Z]\.?+ )|( [A-Z]\.?+\b) 但是,在最终的 Java 字符串中,必须对反斜杠进行转义,因此在最终的 Java 字符串中,每个\ 都会显示为\\

示例代码:

String pattern = "(\\b[A-Z]\\.?+ )|( [A-Z]\\.?+\\b)";
String input1 = "MC Hammer I Smash U";
String input2 = "S. Jennifer A. Adstan JR.";
System.out.println(input1.replaceAll(pattern, ""));
System.out.println(input2.replaceAll(pattern, ""));

输出:

MC锤击

小詹妮弗·阿斯坦。

【讨论】:

  • 有时首字母可能不止一个字母。你的模式不包括这个。
  • @TimBiegeleisen 根据我对问题的解释,这是我深思熟虑的选择。此外,他们可能希望手动验证此类案例,以确保他们没有删除两个字母的名称。
  • 很公平,但我认为两个大写字母不应该被误认为是一个名字。
  • @AshokKumar 看看我的最新编辑。我添加了所有格限定词并解释了为什么需要它。
  • @AshokKumar 很想听听您为什么不接受这个答案。嗨?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多