Ersetzen Sie die Regex nicht, wenn sie von einem Zeichen umgeben ist

9

Ich möchte alle Zeichenfolgen, die von - eingeschlossen sind, in Zeichenfolgen ersetzen, die von ~ eingeschlossen sind, aber nicht, wenn diese Zeichenfolge wieder von * eingeschlossen wird.

Als Beispiel, diese Zeichenfolge ...

%Vor%

... sollte ...

werden %Vor%

Wir sehen - wird nur ersetzt, wenn nicht in *<here>* ist.

Mein javascript-regex für jetzt (was nicht kümmert, ob es von * oder nicht eingeschlossen ist):

%Vor%

Bearbeiten: Beachten Sie, dass es möglicherweise eine ungerade Anzahl von * s gibt.

    
poitroae 28.03.2013, 13:26
quelle

4 Antworten

2

Das ist eine schwierige Sache mit regulären Ausdrücken. Ich denke, was ich tun würde, ist etwa so:

%Vor%

jsFiddle-Demo

Das sucht nach entweder - oder * -Gruppen und führt nur die Ersetzung anhand von gestrichelten Einträgen durch. Im Allgemeinen sind "Nesting" -Syntaxen mit regulären Ausdrücken eine Herausforderung (oder unmöglich). (Und natürlich, als Kommentar zu den Fragezeichen, gibt es spezielle Fälle - dangling metacaracters -, die das auch komplizieren.)

    
Pointy 28.03.2013, 13:32
quelle
1

Ich würde es lösen, indem ich das Array basierend auf * aufspalte und dann nur die geraden Indizes ersetze. Unsymmetrische Sterne zuzuordnen, ist schwieriger, es geht darum zu wissen, ob der letzte Item-Index ungerade oder gerade ist:

%Vor%

Demo

    
Ja͢ck 28.03.2013 13:36
quelle
1

Es ist eine sehr komplizierte Aufgabe herauszufinden, ob eine Übereinstimmung nicht ist, die von einigen Begrenzern eingeschlossen wird - siehe auch Beispiel . Lookaround könnte helfen, aber JS unterstützt nur Lookahead. Also könnten wir " nicht umgeben von ~ " auf " gefolgt von einer geraden Zahl oder ~ " umschreiben und darauf passen:

%Vor%

Aber besser passen wir sowohl auf - als auch auf * , so dass wir alles, was in * s eingeschlossen ist, konsumieren und dann in einer Callback-Funktion entscheiden können, sie nicht zu ersetzen:

%Vor%

Dies hat den Vorteil, dass " eingeschlossen ", z. durch Hinzufügen von Wortgrenzen auf dem "Inneren", zum besseren Umgang mit ungültigen Mustern (ungerade Anzahl von * Zeichen, wie von @Maras zum Beispiel erwähnt) - der aktuelle Regex nimmt nur die nächsten zwei Erscheinungen.

    
Bergi 28.03.2013 13:38
quelle
0

Eine tiefere Version von Jacks sehr klarer Antwort.

%Vor%

Scheint zu funktionieren, Prost.

    
d'alar'cop 28.03.2013 16:43
quelle

Tags und Links