我有一些人的记录,我想用下面的方式分解这些信息:
- 括号内的任何内容都可以视为位置
- 姓氏将是最后一句话-不包括上面的位置
- 名字将是姓氏之前的一切
这里可能有一些不正确的假设,即单字姓氏。我正在寻找使用正则表达式做散装和我保持得到周围的想法。正则表达式将在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也可以很好地工作。