我正在尝试找到格式" 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]+)
感谢大家的建议。
答案 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]+)$
我认为你正在寻找这个。只需抓住小组来满足你的需求。参见演示。
答案 4 :(得分:0)