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.
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.
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.
Beachten Sie, dass der obige Code nicht getestet wurde, es ist nur eine ungefähre Vorstellung davon, was Sie tun müssen.
Um es richtig zu machen, müssen Sie wirklich drei Durchgänge machen:
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.
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.).