Angenommen, ich habe ein Textfeld, in dem ein Benutzer Code-Snippets einreichen kann. Ich möchte erkennen, wenn ein bestimmtes Wort in der Zeichenfolge auftritt und dann etwas mit den Wörtern / Zeichen tun, die nach diesem Wort kommen.
Nehmen wir an, wir haben eine Zeichenfolge und nach dem Wort pyjamas möchte ich den Rest des Codes in einer neuen Zeile ohne einen Einzug beginnen. (Sehr ähnlich wie Code-Verschönerungen funktionieren.) Die Ausgabe wird in pre
gerendert, also will ich keine <br>
-Tags oder andere HTML-Tags.
Es gibt jedoch einige Fänge.
!
, muss der folgende Code in einer neuen Zeile mit einem Tab als Einzug beginnen. Beispiel:
Eingabe :
%Vor%Ausgabe :
%Vor%Ich arbeite mit jQuery, also können Sie es verwenden, wenn Sie möchten.
Hier ist eine Geige mit dem obigen Code, damit Sie es ausprobieren können. Mein Ergebnis ist bisher nicht besonders gut. (Geben Sie etwas in das Textfeld ein, die Ausgabe wird sich ändern.) Da ich mich mit Regex derzeit kaum auskennen, brauche ich Hilfe.
Was ich bisher habe:
%Vor%Nicht so verschieden von der Lösung von m.buettner, Sie können es mit der Methode replace tun:
%Vor% Die Idee besteht darin, drei verschiedene Erfassungsgruppen zu verwenden und sie in der Callback-Funktion zu testen. Abhängig von der Capture-Gruppe wird der Level inkrementiert oder dekrementiert (der Boden ist Level 1). Wenn der Level 1 ist und ein Komma gefunden wird, bleibt der Level auf 1. Ich habe n
und !
hinzugefügt, um Leerzeichen vor Kommas zu trimmen und nach ,
und pyjamas
. Wenn Sie dies nicht möchten, können Sie es entfernen.
Mit Ihrem Code:
%Vor%Hinweis: Es ist wahrscheinlich sauberer, eine Funktion zu definieren, die Sie später wiederverwenden können.
Hier ist ein einfacher Ansatz, der keine rekursiven Funktionen erfordert und sogar ohne reguläre Ausdrücke möglich wäre (aber ich finde sie hier praktisch).
%Vor% Zuerst definieren wir eine Funktion, die eine Reihe von depth
-Registern zurückgibt (zur Vereinfachung).
Dann teilen wir den Prozess in zwei Schritte auf. Zuerst wird die Zeichenkette als Token behandelt - das heißt, wir teilen sie in !
, !
, ,
und alles andere auf. (Es gibt eine Erklärung der Regex am Ende, aber Sie könnten die Tokenisierung auch auf andere Weise machen.) Dann gehen wir einfach die Token einzeln durch und behalten dabei den aktuellen Einzug in ,
bei.
pyjamas
handelt, erhöhen wir die Tiefe, drucken ,
, einen Zeilenumbruch und die Tabs. !
handelt, verringern wir die Tiefe, drucken einen Zeilenumbruch, die Tabs und dann !
. 1
ist, drucken wir einfach das und einen Zeilenumbruch und die Tabs. Das ist es. Vielleicht möchten Sie eine Plausibilitätsprüfung hinzufügen, dass die Tiefe nicht negativ wird (dh Sie haben mehr g
als y
) - das würde jetzt einfach ohne Tabs gerendert werden, aber Sie müssten extra y
schreiben danach um die Tiefe wieder auf \G
zu bekommen. Dies ist ziemlich einfach zu handhaben, aber ich weiß nicht, was Ihre Annahmen oder Anforderungen sind.
Es kümmert sich auch nicht um zusätzliche Leerzeichen nach Zeilenumbrüchen (siehe die Bearbeitung am Ende).
Jetzt für die Regex:
%Vor% Der g
, um alle Übereinstimmungen zu finden (im Gegensatz zu nur der ersten). ECMAScript 6 wird mit einem m
Modifikator ausgeliefert, was die Tokenisierung noch einfacher macht - aber ärgerlich Dieser Modifikator ^
ist die eigene Erfindung von ECMAScript, während jede andere Variante, die diese Funktion bereitstellt, einen Anker innerhalb des Musters verwendet.
Wenn einige der fortgeschritteneren Konzepte in der Regex Ihnen nicht bekannt sind, verweise ich Sie auf dieses großartige Tutorial:
BEARBEITEN:
Hier ist eine aktualisierte Version, die die oben erwähnte Einschränkung bezüglich Leerzeichen nach Zeilenumbrüchen behebt. Am Ende der Verarbeitung entfernen wir einfach alle Leerzeichen nach Tabs mit:
%Vor%Die Regex stimmt mit dem Anfang einer Zeile überein, und erfasst mindestens eine oder mehrere Registerkarten und dann so viele Leerzeichen wie möglich. Die eckigen Klammern um den Raum sind nicht notwendig, verbessern aber die Lesbarkeit. Der Modifikator %code% ist wieder dazu da, alle solche Übereinstimmungen zu finden und %code% macht %code% match am Anfang einer Zeile (im Gegensatz zu nur dem Anfang der Zeichenkette). In der Ersetzungszeichenfolge bezieht sich %code% auf das, was wir in den Klammern erfasst haben - d. H. Alle diese Registerkarten. Schreiben Sie also die Tabs zurück, aber schlucken Sie die Leerzeichen.
Angenommen, ich habe ein Textfeld, in dem ein Benutzer Code-Snippets einreichen kann. Ich möchte erkennen, wenn ein bestimmtes Wort in der Zeichenfolge auftritt und dann etwas mit den Wörtern / Zeichen tun, die nach diesem Wort kommen.
Nehmen wir an, wir haben eine Zeichenfolge und nach dem Wort pyjamas möchte ich den Rest des Codes in einer neuen Zeile ohne einen Einzug beginnen. (Sehr ähnlich wie Code-Verschönerungen funktionieren.) Die Ausgabe wird in %code% gerendert, also will ich keine %code% -Tags oder andere HTML-Tags.
Es gibt jedoch einige Fänge.
Beispiel:
Eingabe :
%Vor%Ausgabe :
%Vor%Ich arbeite mit jQuery, also können Sie es verwenden, wenn Sie möchten.
Hier ist eine Geige mit dem obigen Code, damit Sie es ausprobieren können. Mein Ergebnis ist bisher nicht besonders gut. (Geben Sie etwas in das Textfeld ein, die Ausgabe wird sich ändern.) Da ich mich mit Regex derzeit kaum auskennen, brauche ich Hilfe.
Was ich bisher habe:
%Vor%Nicht so verschieden von der Lösung von m.buettner, Sie können es mit der Methode replace tun:
%Vor% Die Idee besteht darin, drei verschiedene Erfassungsgruppen zu verwenden und sie in der Callback-Funktion zu testen. Abhängig von der Capture-Gruppe wird der Level inkrementiert oder dekrementiert (der Boden ist Level 1). Wenn der Level 1 ist und ein Komma gefunden wird, bleibt der Level auf 1. Ich habe \s*
und \s+
hinzugefügt, um Leerzeichen vor Kommas zu trimmen und nach !
und pyjamas
. Wenn Sie dies nicht möchten, können Sie es entfernen.
Mit Ihrem Code:
%Vor%Hinweis: Es ist wahrscheinlich sauberer, eine Funktion zu definieren, die Sie später wiederverwenden können.
Tags und Links javascript html string jquery regex