正则表达式将字符串细分为Firstname(s),Surname和Location

时间:2014-08-22 12:28:01

标签: php regex preg-match

我有一些人的记录,我想按以下方式分解信息:

  • 括号内的任何内容都可以视为一个位置
  • 姓氏将是 最后一个字 - 不包括上面的位置
  • 名字将是 姓氏之前的一切

这里可能有一些不正确的假设,即单字姓氏。我正在寻求使用正则表达式进行批量处理,并且我会继续关注这个问题。正则表达式的实现将在PHP中。

以下是一些示例记录:

Sam Leicester
Sam Christopher Leicester
Sam Leicester (London)
Sam Christopher Leicester (France)

到目前为止,我已经生成了这个http://regexr.com/39cbk,它将名称解析为一个数组(易于使用最后一个元素作为姓氏,其余作为名字加入)使用该位置的recond组。虽然我似乎对使用preg_match()实现这一点感到高兴。

2 个答案:

答案 0 :(得分:5)

您可以使用此正则表达式:

/^(.*)\s(\w+)(?:\s\((\w+)\))?$/

View a regex demo.

第一个捕获组(.*)尝试匹配任何内容。这允许引擎回溯。如果括号中的位置不存在,我们只需匹配姓氏((\w+))并转义,否则我们将匹配姓氏(\w+)和两个捕获组中的位置。

答案 1 :(得分:2)

您可以使用命名组来简化生活并使用此类正则表达式:

/^(?P<name>\w+ (?:\w+ )*?)(?P<secondName>\w+(?: |$))?(?:\((?P<location>\w+)\))?$/m

DEMO

或没有命名组:

/^(\w+ (?:\w+ )*?)(\w+(?: |$))?(?:\((\w+)\))?$/m

当用户仅指定名称和位置时,此正则表达式也可以正常工作。