Regex将字符串分解为名、姓和位置


Regex to breakdown string into Firstname(s), Surname and Location

我有一些人的记录,我想用下面的方式分解这些信息:

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

这里可能有一些不正确的假设,即单字姓氏。我正在寻找使用正则表达式做散装和我保持得到周围的想法。正则表达式将在PHP中实现。

下面是一些示例记录:

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

到目前为止,我已经生成了这个http://regexr.com/39cbk,它将名称解析为一个数组(易于使用最后一个元素作为姓氏,其余元素作为firstname(s)),并为位置创建了一个记录组。尽管使用preg_match()实现这个功能似乎没有任何乐趣。

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

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

查看regex演示。

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

您可以使用命名组来简化操作,并使用如下regexp:

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

演示

或不带命名组:

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

当用户只指定名称和位置时,这个regexp也可以很好地工作。