我有一个正则表达式,给定全名,应该捕获名字和姓氏。它应该排除后缀,例如“Jr.”:
(.+)\s(.+(?!\sJr\.))
但是这个应用于字符串的正则表达式Larry Farry Barry Jones Jr.
给出了匹配:
1. Larry Farry Barry Jones
2. Jr.
为什么我的负面展望未能忽略“Jr.” 解析全名时?我希望匹配 #2 包含“琼斯”。
与其尝试使用单个正则表达式,我认为以下代码将是更易于维护的代码。
full_name = "Larry Farry Barry Jones Jr."
name_parts = full_name.split - ["Jr."]
first_name, last_name = name_parts[0], name_parts[-1]
正如评论所提到的,它是第一个.*
匹配大多数字符串的。在这里使用前瞻似乎是正确的,因为您不想返回该值并且不需要将其包含在进一步的匹配中。
以下将拆分所有单词,但不返回“Jr.”。所以你可以取第一个和最后一个结果。
(\w+\s)+?(?!\sJr\.)
我推荐使用Rubular来练习 Ruby RegExp。
原因是您的字符串匹配.+
到最后,然后执行正则表达式前瞻,没有“Jr”。跟随(因为我们已经在最后)==>完美,我们匹配!
但那是因为你的模式是错误的。最好是这样:
\S+(?:\s(?!Jr\.)\S+)*
方法:
\S+
匹配一系列至少一个非空白字符。
(?:\s(?!Jr\.)\S+)*
非捕获组:匹配一个空格,然后,如果它不是“Jr.”,则匹配下一系列非空格字符。这个完整的组可以重复 0 次或更多次。