2016-06-10 19 views
1

Ich versuche eine Regex zu schreiben, die Telefonnummern gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern, möglichen Symbolen entspricht, bis ich die nächste Instanz des Wortes Subject finde.RegEx Telefonnummer gefolgt von etwas unbekanntem Text dann ein Wort

Ich habe fast eine Lösung gefunden, aber es enthält Übereinstimmungen Zahlen davor, weil die Regex zu mehrdeutig ist. Nun, das und die Tatsache, dass ich bei Regex lutsche.

In dem Beispiel stimmt es mit der ersten und zweiten Zahl überein, bis das Wort Betreff, ich möchte nur, dass es die Nummer am nächsten zum Wort "Betreff" erhält, während die Zahl noch vor dem Wort ist. Es gibt möglicherweise mehr als eine Instanz, die ich in einem Dokument erkennen muss. Der Text kann mehrere Zeilen umfassen. Der einzige Teil, den ich erfassen muss, ist die Telefonnummer, der Rest ist eine Nicht-Capture-Gruppe.

Kann ich dies auch in RegEx allein tun? Oder muss ich anfangen, Sachen in einer anderen Sprache auszupacken? Wenn es darauf ankommt, wird dies in ein PHP-Skript übernommen.

Beispiel

RegEx

([0-9]{3}\-[0-9]{3}\-[0-9]{4})(?:\w|\s|\-|\')+\bSubject\b 

Sektion:

123-456-7890 - ABC WHAT 
MERICA RULES 
987-654-3210 - ABC WHAT WORDS MORE WORDS 123456789123 
LOREM IPSOM WHO CARES - Subject 

Antwort

0

Sie können alle mit dem g lobaler Modifikator übereinstimmen, und dann das letzte Spiel nehmen?

/(\d{3}-\d{3}-\d{4})(?=.*\bSubject\b)/sg 

s ingle Linie macht . Spiel Zeilenumbrüche auch.

Und in PHP:

<?php 
$input = '123-456-7890 - ABC WHAT 
MERICA RULES 
987-654-3210 - ABC WHAT WORDS MORE WORDS 123456789123 
LOREM IPSOM WHO CARES - Subject 
ANOTHER NOT MATCHES BECAUSE AFTER subject 111-111-1111'; 

preg_match_all('/(\d{3}-\d{3}-\d{4})(?=.*\bSubject\b)/s', $input, $matches); 

echo array_pop($matches[1]); // 987-654-3210 
?> 

Try it online

+0

Dies funktioniert nicht, wenn Sie Ihre Eingabe zweimal in dem Regex Tester kopieren und einfügen, wird die 111-111-1111 abgestimmt. https://regex101.com/r/gV1aO3/3 – sudoroot

+0

@ user2078965 Das liegt daran, dass Sie später einen 'Betreff' im Text haben. – andlrc

+0

Das ist eines meiner Probleme, es wird mehrmals in einem Dokument vorkommen und ich muss das erkennen können. – sudoroot