2016-04-20 8 views
1

私は日付のリストを持っており、日付(01 Aug SA)から次の日付の始めまでの情報をキャプチャしたい EG(31 Jul FR 0135 HKG MEL 33K 18:00 19:44)と次の場合(01 Aug SA 06:40 07:10 11:10)正規表現のワイルドカードとルックアラウンド

私が持っている正規表現は先を見ていますが、私はやり方を見ませんそれ。

regex:: $pattern = '/.*(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})/'; 

7月31日FR 0135 HKG MEL 33K午前18時○○分19:44 8月1日SA
6時40分7時10分午前11時十8月2日SU 0134 MEL HKG 33K 6時40分7時37 15:21 15:51 11:11 03 8月MO G 04 Aug TU 0905 HKG MNL 330 20:50 22:52 05月WE 00:58
0912 MNL HKG 330 08:32 10:36 11:06 14: 16 06 8月TH T2024
P2 19:00 19:00 07月FR 00:30 00:30 05:30
T2314 2R 22:00 22:00 08 Aug SA 06:00 06:00 08:00 09 Aug SU G 10 Aug MO G 11 A ug TU 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 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
06:00 06:00 11: 23 11:23 05:23 T1514 CW 14:00 14:00 19:30 19:30 05:30 16 04 04 04 HKG TPE 33G 10:30 12:16 14:08
0495 TPE HKG 33G 14:59 16:43 17:13 06:43 17 Aug MO O
18 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
22 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
27 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午前7時30分午前7時30分8月31日MO 0564 HKG TPE 330 12:00午後01時10分14時55分0564 TPE KIX 330
16:05午前20時午後8時30午前7時30

+1

正確にあなたの質問は何ですか?あなたは何を達成しようとしていますか? – npinti

+0

私は説明されているテキストから情報を配列に取得しようとしています。 Array [0] = '31 Jul FR 0135 HKG MEL 33K 18:00 19:44 '、array [1] = '01 Aug SA 06:40 07:10 11:10'など、配列へのすべての方法[30 ] = '83 8月MO 0564 HKG TPE 330 12:00 13:10 14:55 0564 TPE KIX 330 16:05 20:00 20:30 07:30 'ありがとう – Trevor

+0

ありがとうございます: - https://regex101.com/r/pD9iT0/2 – rock321987

答えて

2

この正規表現を試してみてください

(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})(.+?)(?:(?=\d{2}\s+[A-Z][a-z]{2}\s+\w{2})|$) 

Regex Demo

正規表現の内訳

(?=\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 
) 

: - 我々はまた、それが

PHPコードがある場合\nをマッチさせたいので、私はs修飾子を使用しています

$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); 

Ideone Demo

+0

それは素晴らしいです。あなたはそれを私に説明することができますので、私はこのようにもう一度尋ねる必要はありません。私はそれをお願い申し上げます 。彼らが言うように、私は漁師になることを学びたい、私はちょうど魚を購入したくない...再度ありがとう – Trevor

+0

@ Trevor大丈夫私は説明を追加しています。数分待って – rock321987

+0

もう一つ質問。何らかの理由で私のコード$ str = "以前のようなロスタコード"; $ pattern = '/(?= \\ d {2} \\ s + [AZ] [az] {2} \\ s + \\ w {2})(? \ d {2} \\ s + [AZ] [az] {2} \\ s + \\ w {2})| \\ z)/ s '; preg_match_all($パターン、$ str、$一致); print_r($ matches);同じ情報(マルチ配列)の2つの配列を生成します。 – Trevor

関連する問題