【发布时间】:2014-08-10 03:41:29
【问题描述】:
我有一系列名字的形式:
- 史密斯,约翰·沃尔特
- 小詹姆斯·塞缪尔·琼斯
我正在努力寻找一个正则表达式,它可以让我将每个元素提取为单独的文本元素。我的代码目前如下所示:
Pattern pattern = Pattern.compile("(.+?), (.+?) (.*)(?:, )((.*))?$");
Matcher matcher = pattern.matcher( name2 );
System.out.println( matcher.find() );
System.out.println( matcher.groupCount() );
System.out.println( matcher.group( 1 ) );
System.out.println( matcher.group( 2 ) );
System.out.println( matcher.group( 3 ) );
System.out.println( matcher.group( 4 ) )
此模式匹配第二种名称格式,允许我提取其组成部分但不匹配第一种(无疑是由于向前看)。当我将前瞻设为可选 ((.+?), (.+?) (.*)(?:, )?((.*))?$) 时,我匹配第一个名称格式,但当我使用第二个名称格式时,我捕获了中间名和后缀。我确信有一种简单的方法可以完成我所追求的目标,但在正则表达式方面我相对缺乏经验。
提前感谢您的帮助!
【问题讨论】:
-
使用
String.split()方法怎么样:name2.split(",") -
您希望从给出的示例中提取哪些元素?此外,您想要的最终结果(“重新排序”之后)是什么?
-
这种问题已经被问过很多次了。如果您没有固定格式 - 尝试解析它是无用的,并且如果您有特定格式 - 删除所有逗号/点/等并使用简单的 split() 提取名字/姓氏(超过空格)。试图找到一个灵丹妙药的正则表达式是浪费时间。