Zeichenfolge nach spezifischem Wort unterbrechen und put bleibt in neuer Zeile (Regex)

8

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.

  1. Alles, was auf ein Wort folgt ( pyjamas ), muss in einer neuen Zeile auf der gleichen "Ebene" beginnen (ebenso viele Tabulatoren) wie die Zeile davor.
  2. Kommas sollten immer in einer neuen Zeile beginnen und umgekehrt mit einem Tab
  3. eingerückt werden
  4. Wenn es ein anderes Zeichen gibt, sagen wir ein Ausrufezeichen ! , 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%     
Bram Vanroy 07.03.2014, 19:43
quelle

2 Antworten

13
___ answer22355825 ___

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.

    
___ tag123jquery ___ jQuery ist eine beliebte Cross-Browser-JavaScript-Bibliothek, die das DOM-Traversal (Document Object Model), die Ereignisbehandlung, Animationen und AJAX-Interaktionen erleichtert, indem die Diskrepanzen zwischen Browsern minimiert werden. Eine mit jQuery gekennzeichnete Frage sollte mit jQuery in Zusammenhang stehen, daher sollte jquery von dem fraglichen Code verwendet werden, und mindestens eine jquery-nutzungsbezogene Elemente müssen in der Frage enthalten sein. ___ tag123html ___ HTML (Hyper Text Markup Language) ist die Standard-Auszeichnungssprache, die zum Strukturieren von Webseiten und zum Formatieren von Inhalt verwendet wird. HTML beschreibt die Struktur einer Website semantisch zusammen mit Hinweisen für die Präsentation, wodurch sie eine Markup-Sprache statt einer Programmiersprache wird. Die neueste Revision der HTML-Spezifikation ist HTML5.2. ___ qstnhdr ___ Zeichenfolge nach spezifischem Wort unterbrechen und put bleibt in neuer Zeile (Regex) ___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ answer2289587 ___

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.

  • Wenn es sich um pyjamas handelt, erhöhen wir die Tiefe, drucken , , einen Zeilenumbruch und die Tabs.
  • Wenn es sich um ! handelt, verringern wir die Tiefe, drucken einen Zeilenumbruch, die Tabs und dann ! .
  • Wenn es 1 ist, drucken wir einfach das und einen Zeilenumbruch und die Tabs.
  • Wenn es etwas anderes ist, drucken wir einfach dieses Token.

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

Arbeitsdemo

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.

Arbeitsdemo.

    
___ qstntxt ___

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.

  1. Alles, was auf ein Wort folgt ( pyjamas ), muss in einer neuen Zeile auf der gleichen "Ebene" beginnen (ebenso viele Tabulatoren) wie die Zeile davor.
  2. Kommas sollten immer in einer neuen Zeile beginnen und umgekehrt mit einem Tab
  3. eingerückt werden
  4. Wenn es ein anderes Zeichen gibt, sagen wir ein Ausrufezeichen %code% , 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%     
___
Martin Ender 09.03.2014, 23:21
quelle
2

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.

    
Casimir et Hippolyte 12.03.2014 15:14
quelle

Tags und Links