我有一个正则表达式,给定全名,应该捕获名字和姓氏。它应该排除后缀,例如“Jr。”:
(.+)\s(.+(?!\sJr\.))
但是对字符串Larry Farry Barry Jones Jr.
应用的正则表达式给出了匹配:
1. Larry Farry Barry Jones
2. Jr.
为什么我的负面预测未能忽略“小”。在解析全名时?我想比赛#2包含“琼斯”。
答案 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+)*
意思是:
\S+
匹配一系列至少一个非空白字符。
(?:\s(?!Jr\.)\S+)*
非捕获组:匹配一个空格,然后,如果它不是“Jr。”,则匹配下一系列的非空白字符。这个完整的组可以重复0次或更多次。