2016-04-27 10 views
1

deckt Ich mag würde die Daten aus dem folgenden Beispiel txtregex, die mehrere Linien

START 
A: 567 B:345 
C: 345 D:485 


START 
A: 345 B:267 
C: 980 D:054 

extrahieren Ich verwende diese Regex ohne positive Ergebnisse:

$regex = '~' 
     . '^(?P<header>.*START:.*)$' 
     //. '^(.*A: \d{3} B: \d{3}.*)$' 
     //. '(.*C: \d{3} D: \d{3}.*)$' 
     . '~m' 
; 

, die mir die gibt folgende Ergebnis:

Array 
(
    [0] => Array 
     (
      [0] => START: 
      [header] =>  START: 
      [1] => START: 
     ) 

    [1] => Array 
     (
      [0] => START: 
      [header] =>  START: 
      [1] => START: 
     ) 

) 

Aber sobald ich die Zeilen Kommentar-

. '^(.*A: \d{3} B: \d{3}.*)$'

und

. '(.*C: \d{3} D: \d{3}.*)$'

ich bekomme kein Spiel!

Wie kann ich diese Daten extrahieren?

Ich habe versucht, den Start der Linie Anker ^ und Ändern der Zeilenende Anker $ zu \n ohne Erfolg Löschen

IM ALLGEMEINEN

Wie kann ich die Daten zu extrahieren, wenn ich einen Start haben von Daten Zeile gefolgt von n Datenzeilen, gefolgt von einem Ende der Datenleitung gefolgt von eine oder mehrere leere Zeilen?

+1

Wenn Sie den Multiline-Flag verwenden 'M' es bedeutet, dass'^'den Anfang des Eingangs an und' $ 'bezeichnet das Ende des Eingangs, nicht das Ende einer Zeile. – Sammitch

+1

@Sammitch m Modifikator: mehrzeilig. Bewirkt, dass^und $ mit dem Beginn/Ende jeder Zeile übereinstimmen (nicht nur Anfang/Ende der Zeichenfolge), und zwar gemäß: regex101.com – Cesar

Antwort

1

Versuchen Sie folgendes:

(START)\s+(A:\s+\d+\s+B:\d+)\s+(C:\s+\d+\s+D:\d+) 

matches:

MATCH 1 
1. [0-5] `START` 
2. [6-18] `A: 567 B:345` 
3. [19-31] `C: 345 D:485` 
MATCH 2 
1. [34-39] `START` 
2. [40-52] `A: 345 B:267` 
3. [53-65] `C: 980 D:054` 

Regex101 Demo
Ideone Demo

1

Wenn Sie eine mehrzeilige Zeichenfolge mit dem Modifikator m (MULTILINE abgleichen, müssen Sie sicherstellen, dass Sie die folgenden Zeilen mit newline mit [\r\n] oder besser mit \R übereinstimmen.

Für Ihre Eingabe folgende regex sollte funktionieren:

/^(?<header>START)$\R+^(?<line1>A:\h*\d{3}\h+B:\h*\d{3})$\R+^(?<line2>C:\h*\d{3}\h+D:\h*\d{3})$/m 

\R Matches jede Newline und \h Matches jede horizontale Leerzeichen in PCRE.

RegEx Demo