正则表达式组不以字符串结尾

时间:2014-11-02 10:31:44

标签: php regex

我有一个名单及其名单

1.uzamaki/narutomr 20mar
2.hyuga/hinata mrs 13apr
3.haruno/sakuramiss 25nov
4.uchiha/sasuke mstr
5.uchiha/itachi akatsuki mr 12feb
6.lee/rock 23jun
7.hatake/kakashi mr 30oct 8.sarutobi/hiruzen mr 31dec

我需要提取序列号,名字,姓氏,标题和dob;

例如在第5号的情况下

number      -> 5
surname     -> uchiha
firstname   -> itachi akatsuki
title       -> mr
dob         -> 12feb

我提出的正则表达式

/(?<number>\d+)\.(?<surname>[a-z\s]*)\/(?<firstname>[a-z\s]*)(?<title>mrs|mr|miss|mstr)?\s(?<dob>\d{2}[a-z]{3})/giU

这在Ungreedy模式下工作正常,但没有dob的行失败。如果我尝试通过添加“&#39;”来使dob成为可选项,则所有模式都不会完全匹配。

那么,是否可以让firstname组不以标题结尾? $ $只能在小组范围内使用吗?

我在这里制作了一个测试http://regex101.com/r/gR7tX2/4

注意:Title和dob是可选组。在名字和标题之间也可能有或没有空格。因此,以标题结尾的有效名字是特殊情况,超出了此任务的范围。

2 个答案:

答案 0 :(得分:3)

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

(?<number>\d+)\.(?<surname>[a-z\s]+)/(?<firstname>[a-z\s]+)\s*(?<title>mrs?|miss|mstr)?(?:\s(?<dob>\d{2}[a-z]{3}))?$

RegEx Demo


更新:根据您的修改,您可以使用此正则表达式:

(?<number>\d+)\.(?<surname>[a-z\s]+)/(?<firstname>[a-z\s]+)\s*(?<title>mrs?|miss|mstr)?(?:\s(?<dob>\d{2}[a-z]{3}))? *(?=\d+\.|$)

RegEx Demo2

PS:使用的标记为miU(多行,忽略大小写,不合适)

答案 1 :(得分:1)

您可以使用此模式但不使用丑陋的U修饰符:

~(?<number>[0-9]+) \.
 (?<surname>[a-z\s]+) / 
 (?<firstname>[a-z\s]+?) 
 (?: \s+ (?<title>m(?:rs?|iss|str)) )?
 (?: \s+ (?<dob>[0-9]{2}[a-z]{3}) )?
 (?=\s[0-9]+\.|$)
~x

demo

唯一有用的非贪婪量词是在firstname组中,目标是修剪尾随空格而不用&#34; eat&#34;标题。由于下两个组是可选的,因此您需要在末尾添加一个前瞻以抽取非贪婪量词,直到项目结尾或标题或dob部分。

相关问题