【问题标题】:How to extract first and last name from full name如何从全名中提取名字和姓氏
【发布时间】:2012-09-26 05:54:18
【问题描述】:

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

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

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

  1.    Larry Farry Barry Jones
  2.    Jr.

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

【问题讨论】:

  • 它没有给出你期望的原因是因为第二个.+本身是"Jr.",后面没有(另一个)"Jr."
  • 要非常小心,假设名称是“first”和“last”。许多文化不遵循这个顺序。如果您(天真地)假设您可以拆分名称并在通信中使用您假设的名字,您可能会导致冒犯客户或用户。如果您正在处理 Web 表单,请为两者输入单独的字段。见stackoverflow.com/a/259694/128421kalzumeus.com/2010/06/17/…

标签: ruby regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    我推荐 Rubular 练习 Ruby RegExp。

    【讨论】:

      【解决方案3】:

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

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

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

      here on Regexr

      意思:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多