Ich muss das Zeichen (say) x durch ein Zeichen (etwa) P in einer Zeichenfolge ersetzen, aber nur, wenn es in einer zitierten Teilzeichenfolge enthalten ist. Ein Beispiel macht es klarer:
%Vor%Gehen wir der Einfachheit halber davon aus, dass Zitate immer paarweise vorkommen.
Der offensichtliche Weg besteht darin, die Zeichenkette nur ein Zeichen gleichzeitig zu verarbeiten (ein einfacher Zustandsmaschinenansatz);
Ich frage mich jedoch, ob reguläre Ausdrücke verwendet werden können, um die gesamte Verarbeitung auf einmal zu erledigen.
Meine Zielsprache ist C #, aber meine Frage bezieht sich auf jede Sprache, die eingebaute oder Bibliotheksunterstützung für reguläre Ausdrücke hat.
Ich konnte das mit Python machen:
%Vor%Was dies bedeutet, verwenden Sie die nicht erfassende Übereinstimmung (? = ...), um zu überprüfen, ob das Zeichen x innerhalb einer Zeichenfolge in Anführungszeichen steht. Es sucht bis zum nächsten Anführungszeichen nach einigen Zeichen ohne Anführungszeichen und sucht dann bis zum Ende der Zeichenfolge nach einer Folge von einzelnen Zeichen oder in Anführungszeichen gesetzten Zeichengruppen.
Dies beruht auf Ihrer Annahme, dass die Kurse immer ausgeglichen sind. Dies ist auch nicht sehr effizient.
Der Trick besteht darin, eine nicht erfassende Gruppe zu verwenden, um den Teil der Zeichenkette nach der Übereinstimmung (Zeichen x ), nach der wir suchen, anzupassen. Der Versuch, die Zeichenfolge mit x abzugleichen, findet nur das erste oder das letzte Vorkommen, je nachdem, ob nicht-gierige Quantifizierer verwendet werden. Hier ist Gregs Idee mit Kommentaren auf Tcl übertragen.
%Vor%Dies druckt:
%Vor%Eine ähnliche Diskussion über ausgewogenen Text ersetzt: Kann regulär sein Ausdrücke verwendet werden, um verschachtelte Muster zu entsprechen?
Obwohl Sie dies in Vim versuchen können, funktioniert es aber nur, wenn die Zeichenfolge in einer Zeile steht und es nur ein Paar gibt.
%Vor% Wenn es ein weiteres Paar oder sogar ein unsymmetrisches 'gibt, könnte es scheitern. So habe ich das c
a.k.a.-Flag für den Befehl ex
eingefügt.
Das Gleiche kann mit sed geschehen, ohne die Interaktion - oder mit awk
, so dass Sie etwas Interaktion hinzufügen können.
Eine mögliche Lösung besteht darin, die Zeilen auf Paaren von '
s zu trennen, was Sie dann mit vim solution tun können.
\G
- Verankern Sie jede Übereinstimmung am Ende der vorherigen oder am Anfang der Zeichenfolge. (?:^[^']*'|(?<=.))
- Wenn es am Anfang der Zeichenkette steht, passe bis zum ersten Zitat an. (?:'[^']*'|[^'x]+)*+
- Entspricht einem beliebigen Block aus nicht-angekreuzten Zeichen oder beliebigen Zeichen (ohne Anführungszeichen) bis zu einem "x". Ein Durchlauf durch die Quellzeichenfolge, mit Ausnahme eines einzelnen Zeichen-Look-Behind.
Entschuldige, dass du deine Hoffnungen gebrochen hast, aber du brauchst einen Push-Down-Automaten, um das zu tun. Es gibt mehr Infos hier: Pushdown Automaton
Kurz gesagt, Reguläre Ausdrücke, bei denen es sich um endliche Automaten handelt, können nur lesen und haben keinen Speicher, während der Pushdown-Automat einen Stack und Manipulationsmöglichkeiten besitzt.
Bearbeiten: Rechtschreibung ...
Tags und Links python language-agnostic c# regex