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

Sam*_*ter 0 php regex preg-match

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

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

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

以下是一些示例记录:

Sam Leicester
Sam Christopher Leicester
Sam Leicester (London)
Sam Christopher Leicester (France)
Run Code Online (Sandbox Code Playgroud)

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

Nor*_*inu 5

你可以使用这个正则表达式:

/^(.*)\s(\w+)(?:\s\((\w+)\))?$/
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示.

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