1

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

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

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

  1.    Larry Farry Barry Jones
  2.    Jr.

为什么我的负面展望未能忽略“Jr.” 解析全名时?我希望匹配 #2 包含“琼斯”。

4

3 回答 3

1

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

full_name = "Larry Farry Barry Jones Jr."
name_parts = full_name.split - ["Jr."]
first_name, last_name = name_parts[0], name_parts[-1]
于 2012-09-26T06:30:44.843 回答
1

正如评论所提到的,它是第一个.*匹配大多数字符串的。在这里使用前瞻似乎是正确的,因为您不想返回该值并且不需要将其包含在进一步的匹配中。

以下将拆分所有单词,但不返回“Jr.”。所以你可以取第一个和最后一个结果。

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

我推荐使用Rubular来练习 Ruby RegExp。

于 2012-09-26T06:43:09.833 回答
1

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

但那是因为你的模式是错误的。最好是这样:

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

在 Regexr 上查看

方法:

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

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

于 2012-09-26T07:00:02.500 回答