Ich möchte, dass ein regulärer Ausdruck all diesen Elementen entspricht:
startabcend
startdef
blahstartghiend
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.
Wenn Sie versuchen, zwischen den Zeilen zu lesen, scheint es, als ob Sie hier nicht nachschauen wollen, Sie wollen nicht-gierige .*?
.
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.)
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.
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
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.
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|^)
.
Tags und Links regex