Regex, um alle \ n in einem String zu ersetzen, aber keine Tags innerhalb des [code] [/ code] -Tags

8

Ich brauche Hilfe, um alle \ n (neue Zeile) Zeichen für
in einem String zu ersetzen, aber nicht diese \ n innerhalb [code] [/ code] Tags. Mein Gehirn brennt, ich kann das nicht alleine lösen: (

Beispiel:

%Vor%

Sollte sein:

%Vor%

Danke für Ihre Zeit. Mit freundlichen Grüßen.

    
Matías 30.11.2008, 03:22
quelle

6 Antworten

7

Ich würde einen (einfachen) Parser vorschlagen und keinen regulären Ausdruck. So etwas (schlechter Pseudocode):

%Vor%     
strager 30.11.2008, 03:29
quelle
6

Sie haben die Frage Regex markiert, aber dies ist möglicherweise nicht das beste Werkzeug für den Job.

Sie könnten besser grundlegende Compiler-Building-Techniken verwenden (d. h. einen Lexer, der einen einfachen State-Machine-Parser einspeist).

Ihr Lexer würde fünf Tokens identifizieren: ("[code]", "\ n", "[/ code]", EOF,: alle anderen Zeichenfolgen :) und Ihre Zustandsmaschine sieht folgendermaßen aus:

%Vor%

EDIT: Ich sehe auf einem anderen Poster die mögliche Notwendigkeit, die Blöcke zu verschachteln. Dieser Zustandsautomat wird das nicht handhaben. Verwenden Sie für das Verschachteln von Blöcken einen rekursiven anständigen Parser (nicht ganz so einfach, aber dennoch einfach und erweiterbar).

EDIT: Axeman merkt an, dass dieser Entwurf die Verwendung von "[/ code]" im Code ausschließt. Ein Fluchtmechanismus kann verwendet werden, um dies zu überwinden. Etwas wie '\' zu deinen Token hinzufügen und hinzufügen:

%Vor%

zur Zustandsmaschine.

Es gelten die üblichen Argumente für maschinengenerierte Lexer und Parser.

    
dmckee 30.11.2008 03:44
quelle
3

Das scheint es zu tun:

%Vor%

Es ist kein einfacher Regex, aber ich glaube nicht, dass Sie mit einer einfachen Regex machen können, was Sie wollen. Nicht mit geschachtelten Elementen und so weiter.

    
cletus 30.11.2008 09:24
quelle
2

Wie von anderen Postern erwähnt, sind reguläre Ausdrücke nicht das beste Werkzeug für den Job, weil sie fast überall als gierige Algorithmen implementiert sind. Dies bedeutet, dass Sie selbst dann, wenn Sie versucht haben, Codebausteine ​​mit etwas wie:

zu vergleichen %Vor%

Dann stimmt der Ausdruck mit dem ersten [code] -Tag bis zum letzten [/code] -Tag überein, was eindeutig nicht das ist, was Sie wollen. Während es Möglichkeiten gibt, dies zu umgehen, sind die resultierenden regulären Ausdrücke normalerweise spröde, nicht intuitiv und geradezu hässlich. Etwas wie der folgende Python-Code würde viel besser funktionieren.

%Vor%

Beachten Sie, dass der obige Code nicht getestet wurde, es ist nur eine ungefähre Vorstellung davon, was Sie tun müssen.

    
shsmurfy 30.11.2008 04:06
quelle
1

Um es richtig zu machen, müssen Sie wirklich drei Durchgänge machen:

  1. Finde [code] Blöcke und ersetze sie mit einem eindeutigen Token + Index (den ursprünglichen Block speicherend), zB wird "foo [code] abc [/ code] bar [code] efg [/ code]" zu foo TOKEN -1 barTOKEN-2 "
  2. Tun Sie Ihren Newline-Ersatz.
  3. Nach Escape-Tokens suchen und den ursprünglichen Block wiederherstellen.

Der Code sieht etwas wie:

aus %Vor%

Das ist der schnelle und schmutzige Weg. Es gibt effizientere Möglichkeiten (andere haben Parser / Lexer erwähnt), aber wenn Sie Millionen von Zeilen verarbeiten und Ihr Code CPU-gebunden ist (und nicht I / O-gebunden wie die meisten Webapps), haben Sie dies mit einem Profiler bestätigt das ist der Flaschenhals, sie sind es wahrscheinlich nicht wert.

* Ich habe es nicht ausgeführt, das ist alles aus dem Gedächtnis. Überprüfen Sie einfach die API und Sie werden in der Lage sein um es auszuarbeiten.

    
noah 30.11.2008 03:55
quelle
1

Es ist schwer, denn wenn Regexes gut sind, etwas zu finden, sind sie nicht so gut darin, alles außer etwas anzupassen. Also musst du eine Schleife benutzen, ich bezweifle, dass du das auf einmal machen kannst.

Nach der Suche fand ich etwas nah an der Lösung von celtus, außer dass der Code-Block nicht verschachtelt werden kann, was zu einfacheren Code führt: Wählen Sie, was Ihren Anforderungen entspricht.

%Vor%

Crude Schnelltest, Sie brauchen mehr (null, leere Zeichenfolge, kein Code-Tag, mehrere, etc.).

    
PhiLho 30.11.2008 09:50
quelle

Tags und Links