2017-03-30 4 views
1

In diesem Beispiel habe ich große Zeichenfolge mit vielen definierten Elementen darin part of example string here. In diesem Beispiel i Spiele von Beispieldatei erhalten (ab ersten (~ 32) Tilde, zu ~ 120 3), die in meiner regex richtig sein Sloud, aber ich brauche regex zu aktualisieren, damit es zuerst am nächsten Spiel erhält in Reverse von ~ 120 3, so das Ergebnis sein:preg_match_all - Get Part zwischen Muster und String

priede EGLE BERZS LAPU KOKI

<?php 

     $regex = '/~[1-9](.*?)\~120 3/s'; 
     preg_match($regex, $str, $matches); 

     echo '<pre>'; 
     print_r($matches); 
     exit(); 
    ?> 

die Frage ist also: Wie soll ich Richtung t gesetzt o Teil der Zeichenfolge in "Reverse" erhalten? Wenn ich ~ 120 3, dann bekomme ich alle Ergebnisse von ~ 120 3 in umgekehrter Reihenfolge, bis ich Tilde Symbol + Nummer - ~ [1-9]?

Angehängtes Bild meines aktuellen Regex-Ergebnisses und markierte wenige Elemente: * Grün - Element, das ich weiß und in meiner Vorstellung - wird Suche rückwärts beginnen. * Grau - das korrekte Ergebnis. * Rot - firest Spiel, was in umgekehrter Richtung von ~ 120 3

enter image description here

Vielen Dank für Empfehlungen im Voraus gefunden wurde!

Antwort

1

Die Frage ist also:

Wie soll ich Richtung in einem Teil des String zu erhalten "reverse"? Wenn ich ~120 3 bin, dann bekomme ich alle Ergebnisse von ~120 3 in umgekehrter Reihenfolge, bis ich Tilde Symbol + Nummer - ~[1-9]?

IT nicht möglich ist, Boost-regex Anpassungsrichtung innerhalb des Eingangs zu ändern, jedoch, können Sie Lookaheads, um den Text abgestimmt zu beschränken.

Acc. zu den Anforderungen benötigen Sie

~[1-9]([^~]*(?:~(?![1-9])[^~]*)*)~120 3 

Siehe regex demo.

Einzelheiten:

  • ~[1-9] - Ihr erster Begrenzer
  • ([^~]*(?:~(?![1-9])[^~]*)*) - Capturing Gruppe 1 Treffer:
    • [^~]* - alle 0+ Zeichen andere als Tilde
    • (?:~(?![1-9])[^~]*)* - 0+ Sequenzen von:
      • ~(?![1-9]) - eine Tilde, die nicht mit einer Ziffer 1-9
      • [^~]* folgt - irgend 0+ Zeichen anders als Tilde
  • ~120 3 - Endebegrenzers

jedoch Es erfasst nicht, was Sie brauchen, da es am Anfang einige Ziffern und Leerzeichen enthält. Vielleicht sollte Ihr Start-Delimiter ~[\d\s]+ sein und der Lookahead sollte dann (?![\d\s]+) sein. Siehe another demo.

+1

Alles klar! Danke für die tolle Antwort! – Artis