2017-04-25 3 views
0

ich einen Text in das folgende Format haben:Regex übereinstimmen, wenn ein Begriff in Gegenwart später in String

Name Andy Andyson 
Address Line 1 43 Main Street 
Address Line 2 Bigtown 
Case Ref 23652/54362 
Office 
Address Line 1 1 Main Street 
Address Line 2 Bigtown 
App Date 12/01/2008 

ich die erste Adresszeile zu extrahieren versuche 1. ich die Regex in PHP bin mit:

/Address Line 1 ([A-Za-z0-9 ]{1,25})/ 

, die nicht vorhanden ist, es sei denn, die erste Adresse große Werke (Text oder die Zeile Address Une 1 zum Beispiel), wobei in diesem Fall könnte es die zweite Adresszeile 1.

Wie kann ich wieder für ce die Regex nur Address Line 1 zurückgeben, wenn es von Office zu einem späteren Zeitpunkt folgt?

Ich habe versucht, Lookaheads mit:

Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office) 
Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*\n\rOffice) 
Address Line 1 ([A-Za-z0-9 ]{1,30})(?!.*\n\rOffice) 
Address Line 1 ([A-Za-z0-9 ]{1,30}).*Office 

Ich denke, Lookaheads ist wie ein später Wert bestätigen in der Zeichenfolge vorhanden ist, aber keine der oben genannten Arbeit.

Wenn es eine Übereinstimmung für die erste Address 1 vor dem Wort Office nicht finden kann, dann möchte ich nur nichts zurückgeben, nicht die zweite Address 1 val.

Folgendes sollte keine Streichhölzer, produziert, während es 1 Main Street derzeit gibt:

Name Andy Andyson 
Address Une 1 43 Main Street 
Address Line 2 Bigtown 
Case Ref 23652/54362 
Office 
Address Line 1 1 Main Street 
Address Line 2 Bigtown 
App Date 12/01/2008 
+0

Haben Sie '' verwenden preg_match' oder in diesem Fall sollte durch ^ (Beginn der Zeile) und $ (Ende der Zeile) und der /m Modifikator verwendet werden sollte umgeben sein preg_match_all'? Sehen Sie sich [diese Demo] (https://regex101.com/r/Irntsj/1) an, Ihre Regex ist in Ordnung mit 'preg_match'. –

+0

@ WiktorStribiżew Sorry, 'preg_match'. – samiles

+0

@ WiktorStribiżew Hmm nein, das funktioniert nicht, es gibt immer noch die zweite Adresszeile 1 ... Versuchen Sie den zweiten Beispieltext, den ich gab. – samiles

Antwort

1

Ihren ersten Versuch (Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office)) OK ist, aber Sie müssen unter Verwendung des Einleiner Modifikator . Spiel Zeilenumbruch machen. Zum Beispiel können Sie es in-line gesetzt (man beachte die (?s)):

(?s)Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office) 

Demo: https://regex101.com/r/R0YZRV/1

Oder legen Sie sie nach dem Schließen regex Klammer:

preg_match('/Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office)/s', $input, $matches); 
                  ^
               Notice this --' 

Demo: https://ideone.com/Bv3tvL

PS

Obwohl nicht explizit angegeben, müssen Sie möglicherweise Office allein auf einer Linie sein.

preg_match('/Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*^Office$)/sm', $input, $matches); 

Demo: https://ideone.com/1pNGNY

+0

Funktioniert perfekt, danke! – samiles

+0

Nur in PHP ist '/ pattern/s' natürlicher als'/(? S) pattern/' –

+0

@ WiktorStribiżew: ja, du hast Recht. Ich habe gerade am IdeOne Demo vorbereitet ... –

Verwandte Themen