У меня есть список дат, и я хочу получить информацию от даты (01 августа SA) вплоть до начала следующей даты
Например, в первом случае (31 июля FR 0135 HKG MEL 33K 18:00 19:44) и в следующем (01 августа SA 06:40 07:10 11:10) и т. Д.
Регулярное выражение, которое я имею, — это взгляд в будущее, но я не понимаю, как это сделать.
regex:: $pattern = '/.*(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})/';
31 июля FR 0135 HKG MEL 33K 18:00 19:44 01 августа SA
06:40 07:10 11:10 02 авг SU 0134 MEL HKG 33K 06:40 07:37
15:21 15:51 11:11 03 августа МО Г 04 августа ТУ 0905 HKG
MNL 330 20:50 22:52 05 августа МЫ 00:58
0912 MNL HKG 330 08:32 10:36 11:06 14:16 06 августа TH T2024
P2 19:00 19:00 07 августа FR 00:30 00:30 05:30
T2314 2R 22:00 22:00 08 августа SA 06:00 06:00
08:00 09 авг су г 10 авг мо г 11 авг
ТУ R13 06:00 06:00 06:06 06:06 00:06 0699 HKG BOM
33G 16:20 17:53 21:07 21:37 07:47 12 авг WE 13
Aug TH RPT 00:00 00:00 02:45 02:45 02:45 14 августа FR 0660
Спецификация HKG 33G 03:05 04:15 12:48 13:18 07:43 15 августа SA R13
06:00 06:00 11:23 11:23 05:23 T1514 CW 14:00 14:00 19:30
19:30 05:30 16 августа SU 0494 HKG TPE 33G 10:30 12:16 14:08
0495 TPE HKG 33G 14:59 16:43 17:13 06:43 17 августа МО
18 августа TU G 19 августа WE 0697 HKG DEL 33G 19:05
21:27 20 августа TH 00:28 00:58 08:23 21 августа FR 0694
DEL HKG 33K 01:30 02:30 10:45 11:15 07:15 MED HC
22 августа SA G 23 августа SU G 24 августа MO G
25 августа TU 0767 HKG SGN 33E 07:30 08:40 10:15 0766 SGN
HKG 33E 11:20 15:10 15:40 08:10 26 августа МЫ Г
27 августа TH G 28 августа FR 0699 HKG BOM 33G 16:20
17:30 21:20 21:50 08:00 29 августа SA 0696 BOM HKG 33G 21:30
22:30 30 августа SU 07:00 07:30 07:30 31 августа МО 0564
HKG TPE 330 12:00 13:10 14:55 0564 TPE KIX 330
16:05 20:00 20:30 07:30
Попробуйте это регулярное выражение
(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})(.+?)(?:(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})|$)
Regex Breakdown
(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2}) #This is the same thing that you have given in question as regex
(.+?) #Lazy matching to match all the characters between the present lookahead till the next lookahead. If we use greedy matching, it will match all the way to the last which we don't want
(?: #Non-capturing group..I am using because of \z
(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2}) #Same lookahead as yours..It basically asserts the next position of the pattern you are searching..We want to capture whatever comes in between the two lookaheads
| #Alternation
$ #This is for capturing the last match because there will be no lookahead that follows the last one
)
НОТА :- Я использую s
модификатор, потому что мы также хотим соответствовать \n
если это там
Код PHP
$re = "/(?=\\d{2}\\s+[A-Z][a-z]{2}\\s+\\w{2})(.+?)(?:(?=\\d{2}\\s+[A-Z][a-z]{2}\\s+\\w{2})|$)/s";
$str = "31 Jul FR 0135 HKG MEL 33K 18:00 19:44 01 Aug SA\n06:40 07:10 11:10 02 Aug SU 0134 MEL HKG 33K 06:40 07:37 15:21 15:51 11:11 03 Aug MO G 04 Aug TU 0905 HKG MNL 330 20:50 22:52 05 Aug WE 00:58\n0912 MNL HKG 330 08:32 10:36 11:06 14:16 06 Aug TH T2024\nP2 19:00 19:00 07 Aug FR 00:30 00:30 05:30\nT2314 2R 22:00 22:00 08 Aug SA 06:00 06:00 08:00 09 Aug SU G 10 Aug MO G 11 Aug TU R13 06:00 06:00 06:06 06:06 00:06 0699 HKG BOM\n33G 16:20 17:53 21:07 21:37 07:47 12 Aug WE 13 Aug TH RPT 00:00 00:00 02:45 02:45 02:45 14 Aug FR 0660 BOM HKG 33G 03:05 04:15 12:48 13:18 07:43 15 Aug SA R13\n06:00 06:00 11:23 11:23 05:23 T1514 CW 14:00 14:00 19:30 19:30 05:30 16 Aug SU 0494 HKG TPE 33G 10:30 12:16 14:08\n0495 TPE HKG 33G 14:59 16:43 17:13 06:43 17 Aug MO O\n18 Aug TU G 19 Aug WE 0697 HKG DEL 33G 19:05 21:27 20 Aug TH 00:28 00:58 08:23 21 Aug FR 0694 DEL HKG 33K 01:30 02:30 10:45 11:15 07:15 MED HC\n22 Aug SA G 23 Aug SU G 24 Aug MO G 25 Aug TU 0767 HKG SGN 33E 07:30 08:40 10:15 0766 SGN HKG 33E 11:20 15:10 15:40 08:10 26 Aug WE G\n27 Aug TH G 28 Aug FR 0699 HKG BOM 33G 16:20 17:30 21:20 21:50 08:00 29 Aug SA 0696 BOM HKG 33G 21:30 22:30 30 Aug SU 07:00 07:30 07:30 31 Aug MO 0564 HKG TPE 330 12:00 13:10 14:55 0564 TPE KIX 330\n16:05 20:00 20:30 07:30";
preg_match_all($re, $str, $matches);
Других решений пока нет …