使用RegEx捕获重复组

时间:2018-07-26 11:48:36

标签: regex

我正在尝试解析如下所示的输入行:

  

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

这是我希望(作为小组)得到的结果:

  • AC#
  • 10
  • N850FD
  • 10%
  • 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

2 个答案:

答案 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);

Try it online!

答案 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语句仍可以“验证”每个部分。