我正在尝试解析如下所示的输入行:
AC#10,N850FD,10%,WEEK,IFR,1/22:45,2 / 00:58,390,F,0743,KEWR,3/02:30,3 / 05:04,380,F,1202, KMEM,3/11:15,3 / 20:04,350,F,0038,LFPG,4/04:00,4 / 15:35,330,F,5342,ZGGG,4/19:05,4 / 22:50,370, F,5608,RJAA,5/13:25,5 / 14:45,300,F,0060,RJBB,5/18:05,6 / 06:35,330,F,0060,KMEM,6/20:45,0 / 05:42,340,F,0948,PHNL,0/07:21,0 / 12:24,370,F,0802,KLAX,0/14:49,0 / 18:09,370,F,0806,KMEM
前5个“字段”为“标题”(“ AC#10,N850FD,10%,WEEK,IFR”),其余为6个“字段”的重复组(例如“ 1/22: 45,2 / 00:58,390,F,0743,KEWR“)。
我是RegEx新手,为此,我想出了以下RegEx语句:(AC#)(\d+),([a-zA-Z0-9]+),(\d+%),(WEEK|DAY),(IFR|VFR)(,\d\/\d{2}:\d{2},\d\/\d{2}:\d{2},\d+,[FR],\d+,[A-Z0-9]{3,5})+
。
可以很好地提取前多个组(“标题”中的每个“字段”)的结果,并且我可以轻松访问每个值(组)。但是我的问题是以下/重复组。仅提取最后一个重复的“组”。如果我删除了最后一个“ +”,则仅(自然)提取出重复的“组”中的第一个。
此处的示例:https://regex101.com/r/HsQMge/1
这是我希望(作为小组)得到的结果:
答案 0 :(得分:2)
正则表达式不是执行此任务的正确工具。也许您可以将其仅用于将字符串拆分为数组。剩下的工作是array_chunk
:
$str = "AC#10,N850FD,10%,WEEK,IFR,1/22:45,2/00:58,390,F,0743,KEWR,3/02:30,3/05:04,380,F,1202,KMEM,3/11:15,3/20:04,350,F,0038,LFPG,4/04:00,4/15:35,330,F,5342,ZGGG,4/19:05,4/22:50,370,F,5608,RJAA,5/13:25,5/14:45,300,F,0060,RJBB,5/18:05,6/06:35,330,F,0060,KMEM,6/20:45,0/05:42,340,F,0948,PHNL,0/07:21,0/12:24,370,F,0802,KLAX,0/14:49,0/18:09,370,F,0806,KMEM";
$data = preg_split('/[,#]/',$str);
$data = array_chunk($data, 6);
var_dump($data);
答案 1 :(得分:0)
我不能让它与一个正则表达式一起工作(仍然认为应该可行),但是我让它可以通过两遍。首先,我使用以下RegEx,将“标题”的各个字段分成几组,然后将其余的输入行作为最后一组(在最后一个逗号后使用“(。*)”):
(AC#)(\d+),([a-zA-Z0-9]+),(\d+%),(WEEK|DAY),(IFR|VFR),(.*)
这使我将其余信息归为一个组(“ 1/22:45,2 / 00:58,390,F,0743,KEWR,3/02:30,3 / 05:04,380,F, 1202,KMEM,3/11:15,3 / 20:04,350,F,0038,LFPG,4/04:00,4 / 15:35,330,F,5342,ZGGG,4/19:05,4 / 22: 50,370,F,5608,RJAA,5/13:25,5 / 14:45,300,F,0060,RJBB,5/18:05,6 / 06:35,330,F,0060,KMEM,6/20:45, 0/05:42,340,F,0948,PHNL,0/07:21,0 / 12:24,370,F,0802,KLAX,0/14:49,0 / 18:09,370,F,0806,KMEM“)。然后,我用另一个正则表达式解析该组,该正则表达式将重复的部分分组(没有问题-现在不再有“标题”):
(\d\/\d{2}:\d{2},\d\/\d{2}:\d{2},\d+,[FR],\d+,[A-Z0-9]{3,4})+
分组与我希望的一样(甚至更好的是“,”也不再是结果的一部分)。奇怪的是,它与“标题”无关。无论如何,我不必求助于“手动”拆分行,并且RegEx语句仍可以“验证”每个部分。