如何从全名中提取名字和姓氏

时间:2012-09-26 05:54:18

标签: ruby regex

我有一个正则表达式,给定全名,应该捕获名字和姓氏。它应该排除后缀,例如“Jr。”:

(.+)\s(.+(?!\sJr\.))

但是对字符串Larry Farry Barry Jones Jr.应用的正则表达式给出了匹配:

  1.    Larry Farry Barry Jones
  2.    Jr.

为什么我的负面预测未能忽略“小”。在解析全名时?我想比赛#2包含“琼斯”。

3 个答案:

答案 0 :(得分:1)

我认为以下将是一个更易于维护的代码,而不是尝试使用单个正则表达式。

full_name = "Larry Farry Barry Jones Jr."
name_parts = full_name.split - ["Jr."]
first_name, last_name = name_parts[0], name_parts[-1]

答案 1 :(得分:1)

作为评论提到它是匹配大部分字符串的第一个.*。在这里使用前瞻似乎是正确的,因为你不想返回该值,也不需要将它包含在进一步的匹配中。

以下将拆分所有单词但不返回'Jr.'所以你可以拿出第一个和最后一个结果。

(\w+\s)+?(?!\sJr\.)

我建议Rubular练习Ruby RegExp。

答案 2 :(得分:1)

原因是你的字符串与你的.+匹配到最后,然后正则表达式前瞻,没有“Jr.”以下(因为我们已经在最后)==>完美,我们匹配!!!

但那是因为你的模式错了。更好的是:

\S+(?:\s(?!Jr\.)\S+)*

here on Regexr

意思是:

\S+匹配一系列至少一个非空白字符。

(?:\s(?!Jr\.)\S+)*非捕获组:匹配一个空格,然后,如果它不是“Jr。”,则匹配下一系列的非空白字符。这个完整的组可以重复0次或更多次。