2016-09-15 1 views
1

Ich habe eine funktionierende Regex, um mehrere Informationen zu extrahieren. Der PHP-Code wird der Folowing:Regex mit mehreren Capture-Gruppen

<?php 

$re = "/(\\d{2}.\\d{2}.\\d{2}).+(\\w{3}).+\\w{3}.+(\\w{2}\\s\\d{4}).+(\\d{2}:\\d{2}\\n).+(\\d{2}.\\d{2}.\\d{2}).+(\\w{2}\\s\\d{4}).+(\\d{2}:\\d{2}\\n).+((FNC|PXO)\\d{3})/"; 
$str = "***NEUBUCHUNG ***\n 24.01.15 TXL FNC AB 2306 11:40 15:20\n 31.01.15 FNC TXL AB 2307 16:05\n FNC044 RESIDENCIAL VILA LUSITANI 9000-120 FUNCHAL\n 1 DOPPELZIMMER      FRUEHSTUECK\n SPO1101\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n F368966 HERR EIDAM, KLAUS    54\n F368966 FRAU EIDAM, SONJA    54"; 

$str2 = "***ÄNDERUNG ***\nNEU:11.04.15 DUS AB 2646 13:15 16:25\n 18.04.15 FNC DUS AB 2647 17:15\n FNC027 PESTANA CARLTON MADEIRA 9004-531 FUNCHAL\n 1 DO-MEERBLICK      F\nF365474 HERR PETERS, HANS        O 03.01.15\nLANGZEITERMÄSSIGUNG 10%\nSPO-JAN_SALES 20%\nFRÜHBUCHER 10%\nINKL. REISELEITUNG UND TRANSFER AB/BIS\nFLUGHAFEN\nZimmer in ruhiger Lage\n(unverbindlicher Kundenwunsch)\nNEU:\nF365474 FRAU PETERS, ULRIKE        O 03.01.15"; 

preg_match($re, $str, $matches); 
print_r($matches) 
?> 

https://ideone.com/UdIaA7

Regex mit str: https://regex101.com/r/rF0uP7/5

Regex mit str2: https://regex101.com/r/cV6iF9/1

aber es perfekt für str funktioniert es nicht in str2 übereinstimmt, und ich kann den Grund nicht finden

Antwort

1

Die .+(\w{3}) am Anfang muss optional sein. Wickeln Sie es mit (?:.+(\w{3}))?.

Siehe regex demo

Auch Sie haben zu viele .+, in den meisten Orten, Sie meinten nur Whitespaces passen und somit besser in \s+ gedreht werden. Außerdem müssen Punkte, die literalen Punkten entsprechen sollen, maskiert werden.

eine optimierte Nutzung:

(\d{2}\.\d{2}\.\d{2})(?:\s+(\w{3}))?\s+\w{3}\s+(\w{2}\s\d{4}).+(\d{2}:\d{2}\n)\s+(\d{2}\.\d{2}\.\d{2}).+(\w{2}\s\d{4})\s+(\d{2}:\d{2}\n).+((FNC|PXO)\d{3}) 

diese sollten Sie regex demo

+1

Hinweis Siehe keine Modifikatoren mit dem RegexMuster in PHP werden (vielleicht '/ U', wenn Sie mit UTF Texte befassen). Nur 'preg_match_all ('~ (\ d {2} \. \ D {2} \. \ D {2}) (?: \ S + (\ w {3}))? \ S + \ w {3} \ s + (\ w {2} \ s \ d {4}). + (\ d {2}: \ d {2} \ n) \ s + (\ d {2} \. \ d {2} \. \ d {2}). + (\ W {2} \ s \ d {4}) \ s + (\ d {2}: \ d {2} \ n). + ((FNC | PXO) \ d {3}) ~ u ', $ str, $ passt) '. –

+0

Sie sind ein Meister Wiktor! Vielen Dank :) – Mary

2

Allerdings funktioniert es perfekt für str es nicht in str2 übereinstimmt, und ich kann nicht der Grund, warum

Hier ist der Schuldige Expression: (\\w{3}).+\\w{3}

Und in $ str hatte Sie 24.01.15 TXL FNC AB

Aber in $ str2, musste man:

$re = "#(\d{2}\.\d{2}\.\d{2})(?:\s+(\w{3}))?\s+\w{3}\s+(\w{2}\s\d{4}).+(\d{2}:\d{2}\n)\s+(\d{2}\.\d{2}\.\d{2}).+(\w{2}\s\d{4})\s+(\d{2}:\d{2}\n).+((FNC|PXO)\d{3})#si"; 
: 11.04.15 DUS AB

Ihre Regex besser wie so lesen konnte

Quick-Test.

Verwandte Themen