Kann Regex für diese spezielle String-Manipulation verwendet werden?

7

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.

    
Cristi Diaconescu 26.09.2008, 10:00
quelle

9 Antworten

8

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.

    
Greg Hewgill 26.09.2008, 10:18
quelle
9

Ich habe Greg Hewgills Python-Code in C # umgewandelt und es hat funktioniert!

%Vor%

Dieser Test ist bestanden.

    
jop 26.09.2008 11:04
quelle
2

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%     
Cristi Diaconescu 26.09.2008 14:17
quelle
2
%Vor%

Würde nicht dieser Brocken die Arbeit machen?

    
Petros 26.09.2008 17:56
quelle
2

Eine allgemeinere (und einfachere) Lösung, die nicht gepaarte Anführungszeichen zulässt.

  1. Suche in Anführungszeichen
  2. Ersetzen Sie "x" durch "P" in der Zeichenfolge

    %Vor%
jfs 29.09.2008 21:16
quelle
1

Nicht mit plain regexp. Reguläre Ausdrücke haben kein "Gedächtnis", so dass sie nicht unterscheiden können, ob sie "innerhalb" oder "außerhalb" sind.

Sie brauchen etwas Stärkeres, zum Beispiel mit gema wäre es geradeheraus:

%Vor%     
Remo.D 26.09.2008 10:08
quelle
1

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.

    
Zsolt Botykai 26.09.2008 10:19
quelle
1
%Vor%
  1. \G - Verankern Sie jede Übereinstimmung am Ende der vorherigen oder am Anfang der Zeichenfolge.
  2. (?:^[^']*'|(?<=.)) - Wenn es am Anfang der Zeichenkette steht, passe bis zum ersten Zitat an.
  3. (?:'[^']*'|[^'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.

    
Markus Jarderot 26.09.2008 13:22
quelle
0

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 ...

    
Tobias Wärre 26.09.2008 10:10
quelle

Tags und Links