需要帮助使用java正则表达式将名称末尾的中间首字母移动到中间

时间:2014-05-16 13:07:08

标签: java regex

我之前就这个问题做了一个话题,它已经关闭并标记为Off-Topic。我试着阅读常见问题解答,但无法弄清楚为什么如果这也是偏离主题的话我请原谅,但我对这个问题还有一些额外的问题。

我有一个字段,其中包含以下格式的全名: 第一,最后(密歇根州)

挑战:

  • 中间的首字母并不总是存在,因为有些条目没有列出中间的首字母。

  • 有些中间名首字母有一段句号。

  • 许多名字都是西班牙名字,所以它们可以有多个名字和姓氏,所以用空格分割字段不是一个选项。

  • 名称字段的末尾可能有空格。

  • 中间名可能包含重音字符(我无法找到任何以重音开头的西班牙语中间名,但我无法确定我们不会有任何重音)。

到目前为止我做了什么:

  • 我做的第一件事是使用trim()删除字段末尾的任何填充。

    FName.trim()

  • 接下来,我将名称分为姓名和姓氏:

    String [] names = FName.split(",");

  • 我需要从姓氏中分割中间名,然后我可以执行以下操作:

    FName = names [0] +" "名字[1] +" " +姓名[2]

我所坚持的:

我需要使用RegEx检查姓氏,看看最后一个字符是否为句点。如果是,那么我需要检查它前面的字符是否是空格+字母(可能是重音)。如果没有一段时间,我仍然需要检查是否有空格+一个字母。

例如:

John, Doe F  --> John F Doe
John, Doe F. --> John F. Doe

我需要稍后删除逗号,但通过执行FName.replace(",","")

可以轻松解决此问题。

更具挑战性的名称示例:

VICTOR, RAMIREZ-BRIANO M
FELIX, DEL VALLE-ORTIZ G.
SANDRA, DE LEON MENDOZA A
MARIA, HERNANDEZ-DE LA TORRE ISABEL J.
CARLOS ARMANDO, PEREZ-FERNANDEZ L
J. CONCEPCION, RODRIGUEZ-BALDERAS
MIGUEL A, LUZURIAGA-ALVAREZ

1 个答案:

答案 0 :(得分:1)

您可以在一行中完成:

name = name.replaceAll(",(.*?)( \\w\\.?)?$", "$2$1");

无论中间的首字母是否在最后出现,这都有效。


这里有一些测试代码使用上面的代码来自问题的例子:

String[] names = { "John, Doe F", "John, Doe F.", "John, Doe", "VICTOR, RAMIREZ-BRIANO M", "FELIX, DEL VALLE-ORTIZ G.", "SANDRA, DE LEON MENDOZA A", "MARIA, HERNANDEZ-DE LA TORRE ISABEL J.", "CARLOS ARMANDO, PEREZ-FERNANDEZ L", "J. CONCEPCION, RODRIGUEZ-BALDERAS", "MIGUEL A, LUZURIAGA-ALVAREZ" };
for (String name : names)
    System.out.println(name + " --> " + name.replaceAll(",(.*?)( \\w\\.?)?$", "$2$1"));

输出:

John, Doe F --> John F Doe
John, Doe F. --> John F. Doe
John, Doe --> John Doe
VICTOR, RAMIREZ-BRIANO M --> VICTOR M RAMIREZ-BRIANO
FELIX, DEL VALLE-ORTIZ G. --> FELIX G. DEL VALLE-ORTIZ
SANDRA, DE LEON MENDOZA A --> SANDRA A DE LEON MENDOZA
MARIA, HERNANDEZ-DE LA TORRE ISABEL J. --> MARIA J. HERNANDEZ-DE LA TORRE ISABEL
CARLOS ARMANDO, PEREZ-FERNANDEZ L --> CARLOS ARMANDO L PEREZ-FERNANDEZ
J. CONCEPCION, RODRIGUEZ-BALDERAS --> J. CONCEPCION RODRIGUEZ-BALDERAS
MIGUEL A, LUZURIAGA-ALVAREZ --> MIGUEL A LUZURIAGA-ALVAREZ