Wie wird das Muster der sich wiederholenden Zeichen / Wörter nur am Anfang der Zeichenfolge ersetzt?

8

Beachten Sie, dass diese Frage im Zusammenhang mit Julia steht und daher (nach meinem Wissen) PCRE.

Angenommen, Sie hätten eine solche Zeichenfolge:

%Vor%

und Sie wollten die sich wiederholenden Zeichen am Ende der Zeichenkette individuell anpassen (im Falle unserer Zeichenkette die vier "s" Zeichen - das heißt, so dass matchall ["s", "s" , "s", "s"], nicht ["ssss"]). Das ist einfach:

%Vor%

Es ist praktisch trivial (und einfach zu verwenden - replace(r"(.)(?=*$)","hell","k") gibt "hekk" , während replace(r"(.)(?=*$)","hello","k") "hellk" ergibt). Und es kann verallgemeinert werden, um Muster zu wiederholen, indem man den Punkt für etwas Komplexeres auswählt:

%Vor%

, die zum Beispiel die letzten drei Instanzen von "abc" in "abc abc defg abc h abc abc abc" unabhängig voneinander abgleichen.

Was führt dann zu der Frage ... wie würden Sie stattdessen den sich wiederholenden Charakter oder das Muster am Anfang der Zeichenkette anpassen? Verwenden Sie Regex wie oben beschrieben.

Der naheliegende Ansatz wäre, die Richtung der obigen Regex als r"(?<=^*)(.)" umzukehren - aber PCRE / Julia erlaubt nicht, dass Lookbehinds eine variable Länge haben (außer dort, wo es eine feste Variable ist, wie (?<=ab|cde) ) löst einen Fehler aus. Der nächste Gedanke ist, "\ K" als etwas in der Art von r"^*\K(.)" zu verwenden, aber dies bringt nur das erste Zeichen zusammen (vermutlich, weil es nach dem Abgleich "vorrückt" und nicht mehr dem Caret entspricht).

Aus Gründen der Übersichtlichkeit: Ich suche eine Regex, die zum Beispiel zu

führt %Vor%

produziert

%Vor%

Wie Sie sehen können, ersetzt es jedes "abc" vom Anfang mit "hallo", aber nur bis zum ersten Nicht-Übereinstimmen. Der umgekehrte, den ich oben biete, macht dies am anderen Ende der Zeichenfolge:

%Vor%

erzeugt

%Vor%     
Glen O 19.07.2015, 15:31
quelle

2 Antworten

8

Sie können den Anker \G verwenden, der mit der Position nach der vorherigen Übereinstimmung oder am Anfang der Zeichenfolge übereinstimmt. Auf diese Weise stellen Sie die Kontiguität der Ergebnisse vom Anfang der Zeichenfolge bis zum letzten Vorkommen sicher:

%Vor%

Demo

oder um bis zum Ende des Strings passen zu können:

%Vor%     
Casimir et Hippolyte 19.07.2015, 17:32
quelle
4

Für PCRE-Style-Engines gibt es leider keine Möglichkeit, dies ohne
zu tun variabler Länge Lookbehind.

Eine reine Lösung ist nicht möglich.
Es gibt kein \G Ankertrick, mit dem dies erreicht werden kann.

Hier ist der Grund warum der \ G Anker nicht funktioniert.

Mit dem Anker ist die einzige Garantie, die Sie haben, dass das letzte Match ist zu einer Übereinstimmung, bei der die Vorwärtsüberlappung als gleich geprüft wurde zum aktuellen Spiel.

Daher können Sie bis zu N-1 des Duplikats nur von Anfang an global zuordnen.

Hier ist ein Beweis:

Regex:

%Vor%

Eingabe:

%Vor%

Ausgabe:

%Vor%

Fazit:

Auch wenn Sie wissen sind Nth aus dem vorherigen Lookahead,
Das Nth kann ohne die Bedingung des aktuellen Lookahead nicht gefunden werden.

Entschuldigung und viel Glück!
Lassen Sie es mich wissen, wenn Sie eine reine Regex-Lösung finden.

    
sln 22.07.2015 22:49
quelle