Regex 使用正则表达式捕获重复组
我正在尝试解析如下所示的输入行: 10岁,10岁,10岁,10岁,10岁,10岁,周,如果他们,1/22:45,2/00:00:58390,F,0743,他们,他们,他们,他们,他们,他们,3/02:30,3/05:30,10岁,10岁,他们,10岁,10岁,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们克拉克斯,0/07:21,0/12:24370,0802楼,0/14:49,0/18:09370,0806楼,KMEM 前5个“字段”为“标题”(“AC#10,N850FD,10%,周,IFR”),其余为6个“字段”的重复组(例如,“1/22:45,2/00:58390,F,0743,KEWR”) 我是一个RegEx新手,但为了做到这一点,我提出了以下RegEx语句:Regex 使用正则表达式捕获重复组,regex,Regex,我正在尝试解析如下所示的输入行: 10岁,10岁,10岁,10岁,10岁,10岁,周,如果他们,1/22:45,2/00:00:58390,F,0743,他们,他们,他们,他们,他们,他们,3/02:30,3/05:30,10岁,10岁,他们,10岁,10岁,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,
(AC#)(\d+)([a-zA-Z0-9]+),(\d+%),(WEEK | DAY),(IFR | VFR)(,\d\/\d{2}:\d{2}、\d\/\d{2}:\d{2}:\d{2}、d、[FR]、\d++、[a-Z0-9]{3,5}
前许多组(标题中的每个“字段”)的结果都被很好地提取出来,我可以很容易地访问每个值(组)。但是,我的问题是以下组/重复组。只提取最后一个重复的“组”。如果我删除最后一个“+”,则只提取第一个重复的“组”(自然)
示例如下:
以下是我希望(作为团队)得到的结果:
- AC#
- 十,
- N850FD
- 10%
- 周
- IFR
- ,1/22:45,2/00:58390,英国皇家水族馆0743楼
- ,3/02:30,3/05:04380,1202层,KMEM
- ,3/11:15,3/20:04350,F,0038,LFPG
- ,4/04:00,4/15:35330,ZGG 5342楼
- ,4/19:05,4/22:50370,RJAA 5608楼
- ,5/13:25,5/14:45300,楼,0060,RJPB
- ,5/18:05,6/06:35330,F,0060,KMEM
- ,6/20:45,0/05:42340,北京时间0948
- ,0/07:21,0/12:24370,KLAX 0802楼
- ,0/14:49,0/18:09370,F,0806,KMEM
可能RegEx不是执行此任务的正确工具。也许你们可以用它把字符串拆分成数组。Rest作业用于
数组\u块
:
$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);
我无法让它与一个正则表达式一起工作(仍然认为这应该是可能的),但是我用了两次就让它工作了。首先,我使用下面的正则表达式,将“header”的各个字段拆分为多个组,然后获取输入行的其余部分作为最后一个组(在最后一个逗号后使用“(*)”):
(AC#)、(\d+)、([a-zA-Z0-9]+)、(\d++%)、周日、(IFR|VFR)、(.*)
这让我把剩下的信息放在一个小组里(“1/22:45,2/00:00:58390,F,0743,KEWR,3/02:30,3/05:05:04380,F,1202,KMEM,3/11:15,3/20:20:20:04350,F,1/11:15,3/11:15,3/11:15,3/11:15:15:20:20:04350,F,F,F,F,F,F,F,F,第1202,第1202,他们他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,他们,3/11:15:15:15:15,3/11:15,3/11:15,3/15,3/15,3/15,3:15,3/15,3/15,3/20:15,3/20:15,3/20:20:20:20:20:20:20:20:20:20克拉克斯,0/14:49,0/18:09370,0806楼,KMEM)。然后,我用另一个正则表达式解析该组,该正则表达式对重复部分进行分组(没有问题-现在不再有“头”):
(\d\/\d{2}:\d{2}、\d\/\d{2}:\d{2}、\d+,[FR]、\d+,[A-Z0-9]{3,4})+
这些组如我所希望的那样(甚至更好的是,“,”不再是结果的一部分)。奇怪的是,它不能处理“标题”。无论如何,我不必“手动”拆分行,正则表达式语句仍然可以“验证”每个部分。组从何处开始/结束?第一个reeting组从后面开始(IFR | VFR)并以“KEWR”结尾。如示例所示(除了我忘了包括最后一个“字段”):“1/22:45,2/00:58390,F,0743,KEWR”。我有一个疯狂的想法。在逗号上拆分一个数组怎么样。然后加入该数组的前5个元素。然后加入下一组6个元素以获取数据。我相信这将有助于提取数据,但同时我想使用正则表达式“验证”数据C#是我的毒药,但我明白你的意思。我可以用逗号分隔整行,然后连接各个部分,然后使用正则表达式验证每个部分。但我相信这应该是可能的与正则表达式在一个去一些how@PelleLiljendal在某种程度上,你几乎有一个验证。只需在正则表达式前面放一行的开头,重复数据部分,然后在正则表达式的末尾添加一行的结尾。如果其中一个数据组不符合要求,则regex将不会有匹配项?