我有一些人的记录,我想按以下方式分解信息:
这里可能有一些不正确的假设,即单字姓氏。我正在寻求使用正则表达式进行批量处理,并且我会继续关注这个问题。正则表达式的实现将在PHP中。
以下是一些示例记录:
Sam Leicester
Sam Christopher Leicester
Sam Leicester (London)
Sam Christopher Leicester (France)
到目前为止,我已经生成了这个http://regexr.com/39cbk,它将名称解析为一个数组(易于使用最后一个元素作为姓氏,其余作为名字加入)使用该位置的recond组。虽然我似乎对使用preg_match()实现这一点感到高兴。
答案 0 :(得分:5)
您可以使用此正则表达式:
/^(.*)\s(\w+)(?:\s\((\w+)\))?$/
第一个捕获组(.*)
尝试匹配任何内容。这允许引擎回溯。如果括号中的位置不存在,我们只需匹配姓氏((\w+)
)并转义,否则我们将匹配姓氏(\w+)
和两个捕获组中的位置。
答案 1 :(得分:2)
您可以使用命名组来简化生活并使用此类正则表达式:
/^(?P<name>\w+ (?:\w+ )*?)(?P<secondName>\w+(?: |$))?(?:\((?P<location>\w+)\))?$/m
或没有命名组:
/^(\w+ (?:\w+ )*?)(\w+(?: |$))?(?:\((\w+)\))?$/m
当用户仅指定名称和位置时,此正则表达式也可以正常工作。