regex optionales Lookahead

9

Ich möchte, dass ein regulärer Ausdruck all diesen Elementen entspricht:

  1. startabcend
  2. startdef
  3. blahstartghiend
  4. blahstartjklendsomething

und um abc , def , ghi bzw. jkl zurückzugeben.

Ich habe folgendes, was für Fall 1 und 3 funktioniert, aber ich habe Probleme, den Lookahead optional zu machen.

%Vor%

Bearbeiten:

Hmm. Schlechtes Beispiel. In Wirklichkeit ist das Bit in der Mitte nicht numerisch, sondern ihm ist eine bestimmte Menge von Zeichen vorangestellt und optional ist es von ihm gefolgt. Ich habe die Eingaben und Ausgaben wie angefordert aktualisiert und ein viertes Beispiel als Antwort auf jemandes Frage hinzugefügt.

    
Paul Hiles 09.09.2011, 11:32
quelle

6 Antworten

8

Wenn Sie versuchen, zwischen den Zeilen zu lesen, scheint es, als ob Sie hier nicht nachschauen wollen, Sie wollen nicht-gierige .*? .

%Vor%

Ich schätze, Sie versuchen, eine Übereinstimmung mit etwas wie "start123end" herzustellen, wollen aber nicht, dass end oder start im übereinstimmenden Text angezeigt werden, und Sie haben daher die Umfragenachfragen dort um die .* einzuschränken, die normalerweise gierig ist.

Stattdessen können Sie einfach die nicht-gierige Variante verwenden und das rechte Ende des Musters mit einem $ verankern.

(Alternativ können Sie, wenn Sie Capture-Gruppen verwenden können, dies stattdessen tun:

%Vor%

und dann holen Sie sich den Wert aus der ersten Erfassungsgruppe.)

    
Amber 09.09.2011, 11:37
quelle
5

Vielleicht so:

%Vor%

Dies wird bis "Start" und "Ende" oder bis zum Ende der Zeile übereinstimmen, zusätzlich muss der Quantifizierer nicht gierig sein ( .*? )

Siehe hier auf Regexr

Das Beispiel in Regexr wurde erweitert, um nicht nur mit Ziffern zu arbeiten.

    
stema 09.09.2011 11:41
quelle
2

Lookahead allein wird nicht die Arbeit machen. Versuchen Sie Folgendes:

%Vor%

Der Lookbehind positioniert Sie nach dem Wort "start", dann verbraucht der Rest alles bis zum nächsten Vorkommen von "end" (aber nicht inklusive).

Hier ist eine Demo auf Ideone.com

    
Alan Moore 09.09.2011 13:39
quelle
1

Ein optionaler Lookahead macht keinen Sinn:

Wenn es optional ist, ist es in Ordnung, wenn es passt, aber es ist auch in Ordnung, wenn es nicht passt. Und da ein Lookahead das Match nicht verlängert, hat es absolut keine Wirkung.

Die Syntax für einen optionalen Lookahead ist also die leere Zeichenfolge.

    
Joachim Sauer 09.09.2011 11:37
quelle
1

wenn "end" immer vorhanden ist, dann benutze: (?<=start)(.*?)(?=end) , wenn Sie das OP eingeben. Da Sie sagen "make the lookahead optional", dann rennen Sie einfach hoch, bis "end" oder der Wagenrücklauf angezeigt wird. %Code%. Wenn Sie nicht daran interessiert sind, die Gruppe "end" zu erfassen, können Sie den Lookahead überspringen und (?<=start)(.*?)(?=end|\n) eingeben, das nach "start" startet, wenn es dort ist und vor "end" stoppt, wenn es da ist. Sie können auch mehr von diesen "oder" Mustern verwenden: (?:start)?(.*?)(?:end)? und (?:start|^) .

    
Dannid 09.09.2016 18:05
quelle
0

Warum brauchen Sie Lookahead?

%Vor%

Sehen Sie es auf rubular

    
Fredrik Pihl 09.09.2011 11:37
quelle

Tags und Links