2016-08-09 98 views
2

Kann mir jemand erklären, warum/wann ich positive Lookarounds in Regex verwenden sollte? Für negative Lookarounds kann ich mir Szenarien vorstellen, in denen sie die einzige Lösung sind, aber für positive Lookarounds sehe ich nicht, warum sie zu verwenden sind, wenn ihr Ergebnis auch mit Capture-Gruppen erzeugt werden kann.Wann verwenden Sie positive Lookarounds in Regex?

Zum Beispiel:

Eingang: Bus: red, Car: blue

Ich will Farbe des Autos.

Mit Lookarounds: (?<=Car:)\w+ Mit Capture-Gruppe: Car: (\w+)

Beide Regex archivieren das gleiche Ergebnis - einen direkten Zugang zum Farbspiel. Gibt es also Fälle, die nur durch positive Blickwinkel gelöst werden können?

Antwort

2

PCRE wird nicht nur in PHP verwendet, die Bibliothek wird in einer Vielzahl von Tools und Sprachen verwendet, wo Sie nicht immer einfachen Zugriff auf Capt Gruppen.

In einigen von ihnen ist ein Lookbehind der einfachste Weg zu sagen, eine Zeichenfolge (mit strsplit in R) zu teilen, oder umgehen Sie die Probleme mit dem Zugriff auf Submatches.

PCRE Lookbehind ist in gewisser Weise "verkrüppelt", das heißt, es ist feste Breite, und ist daher wirklich nicht so vollwertig. Allerdings ist hier an interesting case: ein positiver Lookbehind wird verwendet nach die übereinstimmende Leistung: \d{3}(?<=USD\d{3}). Hier beginnt der Scheck erst, nachdem wir 3 Ziffern gefunden haben, müssen nicht überprüfen U, dann S, dann , dann Ziffern.

Wie für eine positive Vorschau, ist es in vielen Szenarien:

  • Sets Bedingungen auf der Saite angepasst (siehe Dmitry Antwort, auch zB ^(?=.*\d) mindestens 1 Stelle in der Zeichenfolge erfordert)
  • Overlapping Spiele möglich sind (zB -\d+(?=-|$) 3 Treffer in der -1-2-3 finden)
1

Positive Lookarounds können nützlich sein, wenn einem Muster zusätzliche Bedingungen auferlegt werden, ohne das Hauptmuster zu beeinflussen.

Zum Beispiel müssen Sie, wenn eine Zeichenfolge überprüfen einen roten Bus oder ein blaues Auto enthält und nicht mehr als 20 charactes:

^(?=.{0,20}$).*(?:Bus: red|Car: blue) 

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

Weitere Beispiele Diese Art kann hier gefunden werden: https://stackoverflow.com/a/21456918/4295017

+0

Nur noch eine Frage. Warum schreibst du den Lookahead vor das Haupt-Regex-Muster? Ich dachte, ich müsste Lookaheads schreiben wie auch Lookbehinds nach/rechts zum Regex-Muster, auf das es sich bezieht ?! – netblognet

+0

@netblognet, eigentlich ist es nach dem '^' Muster, also ist dieses '^' das Muster, an das der Lookahead gebunden ist. –