我有一个名单及其名单
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是可选组。在名字和标题之间也可能有或没有空格。因此,以标题结尾的有效名字是特殊情况,超出了此任务的范围。
答案 0 :(得分:3)
您可以使用此正则表达式:
(?<number>\d+)\.(?<surname>[a-z\s]+)/(?<firstname>[a-z\s]+)\s*(?<title>mrs?|miss|mstr)?(?:\s(?<dob>\d{2}[a-z]{3}))?$
更新:根据您的修改,您可以使用此正则表达式:
(?<number>\d+)\.(?<surname>[a-z\s]+)/(?<firstname>[a-z\s]+)\s*(?<title>mrs?|miss|mstr)?(?:\s(?<dob>\d{2}[a-z]{3}))? *(?=\d+\.|$)
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
唯一有用的非贪婪量词是在firstname组中,目标是修剪尾随空格而不用&#34; eat&#34;标题。由于下两个组是可选的,因此您需要在末尾添加一个前瞻以抽取非贪婪量词,直到项目结尾或标题或dob部分。