正则表达式,以查找"姓氏,名字中间名"格式

A P*_*aul 7 java regex

我试图找到格式"abc,def g",这是一种名称格式"lastname,firstname middlename".我认为最合适的方法是正则表达式,但我在Regex中没有任何想法.我尝试在正则表达式中做一些学习并尝试了一些表达但没有运气.另外一点可能在单词之间有多个空格.

这是我试过的.但这不起作用.

(([A-Z][,]\s?)*([A-Z][a-z]+\s?)+([A-Z]\s?[a-z]*)*)
Run Code Online (Sandbox Code Playgroud)

需要帮忙 !知道如何做到这一点,只有上面的表达式匹配.

谢谢 !

回答

最后我正在使用

([A-Za-z]+),\\s*([A-Za-z]+)\\s*([A-Za-z]+)
Run Code Online (Sandbox Code Playgroud)

感谢大家的建议.

Ell*_*sch 6

我会尝试避免复杂的正则表达式,我会使用String.substring()indexOf().就是这样的

String name = "Last, First Middle";
int comma = name.indexOf(',');
int lastSpace = name.lastIndexOf(' ');
String lastName = name.substring(0, comma);
String firstName = name.substring(comma + 2, lastSpace);
String middleName = name.substring(lastSpace + 1);
System.out.printf("first='%s' middle='%s' last='%s'%n", firstName,
            middleName, lastName);
Run Code Online (Sandbox Code Playgroud)

输出是

first='First' middle='Middle' last='Last'
Run Code Online (Sandbox Code Playgroud)


And*_*ter 4

您的示例输入是"lastname, firstname middlename"- 有了它,您可以使用以下正则表达式来提取姓氏、名字和中间名(此外,可能有多个空格,并且字符串中可能同时存在大写和非大写字母 - 也,所有部分都是强制性的):

\n\n
String input = "Lastname,   firstname   middlename";\nString regexp = "([A-Za-z]+),\\\\s+([A-Za-z]+)\\\\s+([A-Za-z]+)";\n\nPattern pattern = Pattern.compile(regexp);\nMatcher matcher = pattern.matcher(input);\nmatcher.find();\nSystem.out.println("Lastname  : " + matcher.group(1));\nSystem.out.println("Firstname : " + matcher.group(2));\nSystem.out.println("Middlename: " + matcher.group(3));\n
Run Code Online (Sandbox Code Playgroud)\n\n

简短的摘要:

\n\n
([A-Za-z]+)   First capture group - matches one or more letters to extract the last name\n,\\\\s+         Capture group is followed by a comma and one or more spaces\n([A-Za-z]+)   Second capture group - matches one or more letters to extract the first name\n\\\\s+          Capture group is followed by one or more spaces\n([A-Za-z]+)   Third capture group - matches one or more letters to extract the middle name\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅当您的名字仅包含拉丁字母时,这才有效 - 也许您应该对字符使用更开放的匹配:

\n\n
String input = "M\xc3\xbcller,   firstname  middlename";\nString regexp = "(.+),\\\\s+(.+)\\\\s+(.+)";\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与姓氏、名字和中间名的任何字符匹配。

\n\n

如果空格是可选的(只有第一次出现可以是可选的,否则我们无法区分名字和中间名),则使用*而不是+

\n\n
String input = "M\xc3\xbcller,firstname  middlename";\nString regexp = "(.+),\\\\s*(.+)\\\\s+(.+)";\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

正如@Elliott 提到的,可能还有其他可能性,例如 usingString.split()String.indexOf()with String.substring()- 正则表达式通常更灵活,但更难维护,特别是对于复杂的表达式。

\n\n

无论哪种情况,请使用尽可能多的不同输入(包括无效输入)实施单元测试,以便您可以验证算法在修改后是否仍然有效。

\n