Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式组不以字符串结尾_Php_Regex - Fatal编程技术网

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

Php 正则表达式组不以字符串结尾,php,regex,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 我需要提取序列号、名字、姓氏、头衔和出生日期 例如5号案例 nu

我有一张名单和他们的出生日期

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
我需要提取序列号、名字、姓氏、头衔和出生日期

例如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
/(?\d+)\(?[a-z\s]*)\/(?[a-z\s]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]*)(?[a-z]//giU
这在取消冻结模式下可以正常工作,但没有dob的线路会出现故障。如果我试图通过添加一个“?”使dob成为可选的,则没有一个模式完全匹配

那么,firstname组是否可能不以标题结尾?美元能否仅在集团范围内使用

我在这里做了一个测试


注:标题和dob为可选组。名字和头衔之间可能有空格,也可能没有。因此,以标题结尾的有效名字属于特殊情况,不在本任务范围内。

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

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

PS:使用的标志是
miU
(多行、忽略大小写、取消冻结)

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

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

PS:使用的标志是
miU
(多行、忽略大小写、取消冻结)

您可以使用此模式,但不使用丑陋的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
~(?[0-9]+)\。
(?[a-z\s]+)/
(?[a-z\s]+?)
(?:\s+(?m(?:rs?| iss | str)))?
(?:\s+(?[0-9]{2}[a-z]{3}))?
(?=\s[0-9]+\.\124;$)
~x


唯一有用的非贪婪量词是在firstname组中,目标是在不“吃掉”标题的情况下修剪尾随空格。由于接下来的两个组是可选的,您需要在末尾添加一个前瞻,以便在项目或标题或dob部分的末尾添加非贪婪量词。

您可以使用此模式,但不使用丑陋的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
~(?[0-9]+)\。
(?[a-z\s]+)/
(?[a-z\s]+?)
(?:\s+(?m(?:rs?| iss | str)))?
(?:\s+(?[0-9]{2}[a-z]{3}))?
(?=\s[0-9]+\.\124;$)
~x


唯一有用的非贪婪量词是在firstname组中,目标是在不“吃掉”标题的情况下修剪尾随空格。由于接下来的两组是可选的,因此您需要在末尾添加一个前瞻,以便在项目或标题或dob部分的末尾添加非贪婪量词。

感谢您的回复!这很好,但我们不能在最后有一个$(我的坏,将用一个额外的测试用例更新问题),因为一行中可能有多个名称。另外,你能解释一下dob上的包装器组是什么吗?除非我设置为非贪婪,否则它不会单独捕获(?[a-z\s]+?),但在我的演示2中,我可以看到
title
bing到处都被捕获。@anubhava哇!你是一个雷格士忍者,我在后面的积极展望中迷失了方向,你能给我一个解释吗?@anubhava我现在明白了。我认为这是因为Demo2中的“U”(ungreedy)修饰符(在我的测试仪中没有默认设置)。我建议在你的回答中对此进行评论,或者让自己变得懒惰。谢谢你的回答!这很好,但我们不能在最后有一个$(我的坏,将用一个额外的测试用例更新问题),因为一行中可能有多个名称。另外,你能解释一下dob上的包装器组是什么吗?除非我设置为非贪婪,否则它不会单独捕获(?[a-z\s]+?),但在我的演示2中,我可以看到
title
bing到处都被捕获。@anubhava哇!你是一个雷格士忍者,我在后面的积极展望中迷失了方向,你能给我一个解释吗?@anubhava我现在明白了。我认为这是因为Demo2中的“U”(ungreedy)修饰符(在我的测试仪中没有默认设置)。我建议在你的答案中对此进行评论,或者让它变得懒惰。这在测试用例1和3中失败,其中标题是名字的一部分。但名字的有趣分离,让我思考一下这个技巧。谢谢您的回复。@Botchedevil:我还没有看到没有空格分隔的标题。在本例中,您可以使用一个否定的lookback,请参见我的编辑。但名字的有趣分离,让我思考一下这个技巧。谢谢你的回应。@botchedDevil:我还没有看到有没有用空格分隔的标题。在这种情况下,您可以使用负查找,请参见我的编辑。