我的名字有“D John Livingston”,“S。Jennifer Adstan”,我只希望从名字中删除首字母,名字中的“D”和“S”。在第二个名字。我怎么能用java regex呢?
答案 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()
,以便在开头或结尾处对首字母进行一些空格清理。
答案 1 :(得分:1)
为此,我会考虑使用字符串replaceAll()。
那么我们如何设计正则表达式?
基本上你需要考虑三种情况:
对于前两种情况,您需要不留空格。因此,您将匹配一个空格并将其替换为零空格。
对于最后一种情况,您需要留一个空格。但是,不是明确地处理这种情况,而是将其视为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。