正则表达式从全名删除首字母

时间:2018-02-26 06:16:59

标签: java regex regex-negation

我的名字有“D John Livingston”,“S。Jennifer Adstan”,我只希望从名字中删除首字母,名字中的“D”和“S”。在第二个名字。我怎么能用java regex呢?

2 个答案:

答案 0 :(得分:4)

以下代码段似乎运作良好:

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

答案 1 :(得分:1)

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

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

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

  • 甲。名称开头的单个字母(可选期间),后跟一个字母 空间
  • B中。名称末尾的单个字母(可选期间),前面有一个字母 空间
  • ℃。名称中间的单个字母(可选期间),包围 两个空格

对于前两种情况,您需要不留空格。因此,您将匹配一个空格并将其替换为零空格。

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

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

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

我们如何代表可选期间?由于期间是特殊字符,因此必须对其进行转义:\.然后将其标记为可选,并带有问号:\.?但是,A.仍然存在问题名称的中间可能只匹配为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 Hammer Smash

     

Jennifer Adstan JR。