我试图找到格式"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)
感谢大家的建议.
我会尝试避免复杂的正则表达式,我会使用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)
您的示例输入是"lastname, firstname middlename"- 有了它,您可以使用以下正则表达式来提取姓氏、名字和中间名(此外,可能有多个空格,并且字符串中可能同时存在大写和非大写字母 - 也,所有部分都是强制性的):
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));\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n仅当您的名字仅包含拉丁字母时,这才有效 - 也许您应该对字符使用更开放的匹配:
\n\nString input = "M\xc3\xbcller, firstname middlename";\nString regexp = "(.+),\\\\s+(.+)\\\\s+(.+)";\nRun Code Online (Sandbox Code Playgroud)\n\n这与姓氏、名字和中间名的任何字符匹配。
\n\n如果空格是可选的(只有第一次出现可以是可选的,否则我们无法区分名字和中间名),则使用*而不是+:
String input = "M\xc3\xbcller,firstname middlename";\nString regexp = "(.+),\\\\s*(.+)\\\\s+(.+)";\nRun Code Online (Sandbox Code Playgroud)\n\n正如@Elliott 提到的,可能还有其他可能性,例如 usingString.split()或String.indexOf()with String.substring()- 正则表达式通常更灵活,但更难维护,特别是对于复杂的表达式。
无论哪种情况,请使用尽可能多的不同输入(包括无效输入)实施单元测试,以便您可以验证算法在修改后是否仍然有效。
\n