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

时间:2014-09-12 05:17:36

标签: java regex

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

这就是我尝试过的。但这不起作用。

(([A-Z][,]\s?)*([A-Z][a-z]+\s?)+([A-Z]\s?[a-z]*)*)

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

谢谢!

ANSWER

最后我正在使用

([A-Za-z]+),\\s*([A-Za-z]+)\\s*([A-Za-z]+)

感谢大家的建议。

5 个答案:

答案 0 :(得分: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);

输出

first='First' middle='Middle' last='Last'

答案 1 :(得分:3)

您的示例输入为"lastname, firstname middlename" - 您可以使用以下正则表达式来提取lastname,firstname和middlename(另外可能有多个空格,并且可能同时包含大写和非 - 字符串中的大写字母 - 所有部分都是强制性的):

String input = "Lastname,   firstname   middlename";
String regexp = "([A-Za-z]+),\\s+([A-Za-z]+)\\s+([A-Za-z]+)";

Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(input);
matcher.find();
System.out.println("Lastname  : " + matcher.group(1));
System.out.println("Firstname : " + matcher.group(2));
System.out.println("Middlename: " + matcher.group(3));

简短摘要:

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

这仅适用于您的名字仅包含拉丁字母的情况 - 可能您应该为字符使用更开放的匹配:

String input = "Müller,   firstname  middlename";
String regexp = "(.+),\\s+(.+)\\s+(.+)";

匹配姓氏,名字和中间名的任何字符。

如果空格是可选的(只有第一次出现是可选的,否则我们无法区分出firstname和middlename),那么使用*而不是+

String input = "Müller,firstname  middlename";
String regexp = "(.+),\\s*(.+)\\s+(.+)";

正如@Elliott所提到的,可能还有其他可能性,例如将String.split()String.indexOf()String.substring()一起使用 - 正则表达式通常更灵活,但更难维护,尤其是对于复杂表达式。

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

答案 2 :(得分:1)

作为直接匹配lastname, firstname middlename的替代方法,您可以使用String.split并提供与分隔符匹配的正则表达式。例如:

static String[] lastFirstMiddle(String input){
    String[] result=input.split("[,\\s]+");
    System.out.println(Arrays.asList(result));
    return result;
}

我用输入

测试了这个
"Müller,   firstname  middlename"
"Müller,firstname  middlename"
 "O'Gara, Ronan Ramón"

注意:此方法失败,姓氏包含空格,例如" van der Heuvel"," de Valera"," mac Piarais"或者"本拉登"但是再一次,OP的原始规范似乎并不承认姓氏中的空格(或其他名称。我与#34; Mary Kate"。这是她的名字,不是第一和中间)。在http://www.w3.org/International/questions/qa-personal-names

有一个关于个人姓名的有趣页面

答案 3 :(得分:0)

^([a-zA-Z]+)\s*,\s*([a-zA-Z]+)\s+([a-zA-Z]+)$

我认为你正在寻找这个。只需抓住小组来满足你的需求。参见演示。

http://regex101.com/r/hQ1rP0/6

答案 4 :(得分:0)

我认为这个也会比你的更短:

([A-Z][a-z]*)(?:,\s*)?

Demo

或者您可以使用此正则表达式进行拆分:

(,?\s+)