Ich habe einige "tokenisierte" Vorlagen, zum Beispiel (ich rufe Tokens den Teil zwischen doppelten Klammern):
%Vor%Ich möchte ein Array aus diesem Satz extrahieren, um etwas zu haben wie:
%Vor%Ich habe versucht, das mit dem folgenden Regex-Code zu erreichen:
%Vor%Und das Ergebnis ist:
%Vor%Das erste Problem war, dass ich die Tokens nicht aus dem Satz wiederherstellen konnte. Ich löste das, indem ich nur die Klammern im Regex-Ausdruck hinzufügte, obwohl ich mir nicht sicher bin, warum es das löst.
Das Problem, mit dem ich derzeit konfrontiert bin, ist der extra leere Term am Anfang und / oder am Ende des Arrays , wenn die ersten und / oder letzten Begriffe in der Vorlage "Tokens" sind . Warum passiert es? Mache ich etwas falsch, oder sollte ich diese beiden Positionen immer auf Leerheit überprüfen?
In meinem Code muss ich wissen, welcher Begriff von einem Token stammt und welcher eine feste Position in der Vorlage war. Bei dieser Lösung muss ich die Position jedes Arrays für einen String überprüfen, der mit "{{" beginnt und mit "}} endet, was meiner Meinung nach nicht die beste Möglichkeit ist. Also, wenn jemand eine bessere Lösung findet, um diese Dinge auseinander zu brechen, werde ich es gerne wissen!
Danke!
Bearbeiten: Wie gewünscht, poste ich ein einfaches Beispiel, warum ich diese Unterscheidung für Token und Text benötige.
%Vor%Auf diese Weise habe ich eine Liste der Teile, aus denen meine Zeichenfolge besteht, und ich kann diese in meiner Datenbank aufzeichnen, um zukünftige Manipulationen und Ersetzungen zu ermöglichen. Tatsächlich wird jeder dieser TOKEN durch einen Regex-String ersetzt.
Das Ziel ist, dass Benutzer Nachrichten wie "{{SERVER}}" eingeben können, die nicht auf Port {{PORT}} hören, und ich kann "{{SERVER}}" in% ersetzen. co_de% und "{{PORT}}" zu [a-zA-Z0-9 ]+
. Macht Sinn?
Ich hoffe, das macht den Beitrag klarer.
Wenn Sie eine Zeichenkette entlang von Trennzeichen teilen und die Zeichenkette mit einem Trennzeichen beginnt oder endet, bedeutet dies, dass ein leeres Element vor / nach dem ersten / letzten Trennzeichen steht:
Stellen Sie sich die folgende Zeile in einer CSV-Datei vor:
%Vor% Diese CSV-Zeile enthält die Elemente ""
, "a"
, "b"
, "c"
und ""
.
Das Gleiche passiert mit Ihrem {{TOKEN}}
. Sie könnten eine andere Methode verwenden:
Wenn einzelne Klammern innerhalb oder zwischen Tokens auftreten können, können Sie auch
verwenden %Vor%, die wegen all der Lookahead-Assertionen jedoch etwas weniger effizient sein wird. Sie sollten dies also nur bei Bedarf verwenden.
Bearbeiten: Ich habe gerade bemerkt, dass es in Ihrem Beitrag eine weitere Frage gab: Warum mussten Sie Klammern um Ihre Regex setzen, damit sie "funktioniert"? Antwort: Normalerweise gibt ein split()
-Befehl nur den Inhalt zwischen Trennzeichen zurück. Wenn Sie die Trennzeichen (oder Teile davon) in erfassende Klammern einschließen, wird auch das, was in diesen Klammern gefunden wird, zur Ergebnisliste hinzugefügt.