Frage

Ich habe eine Stunde lang mit diesem gespielt oder Werg und habe mich mit dem Lua Pattern-Matching-Dienstprogramme an einer Straßensperre gefunden. Ich versuche, alle zitierten Text in einer Zeichenfolge zu entsprechen und sie ersetzen, wenn nötig.

Das Muster, das ich mit so weit kommen muß, ist: (\ [\ "\ ']?) (.-)% 1

Das funktioniert in einigen Fällen aber nicht alle Fälle:

Working: "This \"is a\" string of \"text to\" test with"

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"

Im nicht Beispiel arbeitet Ich mag würde es passen (ich eine Funktion gemacht, dass die Spiele bekommt Ich wünsche, ich suche nur nach einem Muster auf der Verwendung mit gsub und neugierig, wenn ein lua Muster dies tun kann):

 string
 a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit

Ich werde weiterhin meine Funktion statt für vorerst zu verwenden, aber neugierig bin, wenn es ein Muster ist, könnte ich / verwenden sollte, und ich bin fehle nur etwas mit Mustern.

(einige Änderungen b / c ich vergessen stackoverflows Formating) (Ein anderes bearbeiten ein Nicht-HTML-Beispiel zu machen, da es zu Annahmen führe, dass ich zu parsen html versuche)

War es hilfreich?

Lösung

Der Versuch entkommen Spiel, zitierten Text mit regulären Ausdrücken ist wie der Versuch, die Gänseblümchen (und nur die Podien) aus einem Feld mit einem Rasenmäher zu entfernen.

  

Ich habe eine Funktion, die die Spiele bekommt Ich wünsche

Dies ist der richtige Schritt.

  

Ich bin gespannt, ob ein lua Muster dies tun kann,

Aus praktischer Sicht auch wenn ein Muster dies tun kann, Sie wollen nicht. Aus theoretischer Sicht versuchen Sie ein doppeltes Anführungszeichen zu finden, die vorangeht durch eine gerade Anzahl von Schrägstrichen. Dies ist definitiv eine reguläre Sprache, und der reguläre Ausdruck Sie so etwas wie die folgenden (Lua Zitierkonventionen) würde sein wollen

[[[^\](\\)*"(.-[^\](\\)*)"]]

Und die Zeichenfolge in Anführungszeichen 2 # würde. Aber Lua Muster sind nicht volle reguläre Ausdrücke; Insbesondere können Sie keine * nach einem geklammerten Muster setzen. So meine Vermutung ist, dass dieses Problem nicht Lua Mustern gelöst werden können, , aber da Lua Muster sind kein Standard, was in der Automatentheorie, bin ich keine Kenntnis von einem Körper von Beweistechnik, die Sie verwenden können beweisen es.

Andere Tipps

Das Problem mit entkam Anführungszeichen ist, dass im Allgemeinen, wenn es eine ungerade Anzahl von Schrägstriche vor dem Zitat, dann ist es entkommen, und wenn es eine gerade Zahl ist, ist es nicht. Ich glaube nicht, dass Lua Pattern-Matching stark genug ist, um diese Bedingung zu stellen, wenn Sie also zu parsen Text wie diese benötigen, dann sollten Sie einen anderen Weg zu suchen. Vielleicht können Sie durch die Zeichenfolge durchlaufen und analysieren sie, oder man könnte jedes Zitat wiederum finden und rückwärts gelesen, die Schrägstriche zu zählen, bis Sie einen nicht-umgekehrten Schrägstrich finden (oder den Anfang des Strings).

Wenn Sie unbedingt Muster aus irgendeinem Grunde verwenden müssen, könnten Sie versuchen, dies zu tun in einem mehrstufigen Prozess. Erstens gsub für alle Vorkommen von zwei Schrägstriche in einer Reihe, und ersetzen Sie sie mit etwas Sentinel-Wert. Dieser muss ein Wert sein, der nicht bereits in der Zeichenfolge auftreten. Man könnte so etwas wie „\ 001“ versuchen, wenn Sie diese Zeichenfolge wissen nicht, nicht druckbare Zeichen enthält. Wie auch immer, wenn Sie alle Sequenzen von zwei Schrägstriche in einer Reihe ersetzt haben, verlassen alle Schrägstriche die folgenden Zeichen sind auf der Flucht. Jetzt können Sie Ihre ursprünglichen Muster anwenden, und dann schließlich können Sie alle Instanzen des Sentinel-Wertes mit zwei Schrägstrichen wieder ersetzen.

Lua Mustersprache ist ausreichend für viele einfache Fälle. Und es hat zumindest einen Trick, den Sie in einem typischen regulären Ausdruck Paket nicht finden: eine Art und Weise ausgeglichen Klammer zu passen. Aber es hat seine Grenzen als auch.

Wenn diese Grenzen überschritten werden, dann erreiche ich für LPeg . LPeg ist eine Implementierung eines Parsing Expression Grammer für Lua , und wurde von einem der Lua ursprünglichen Autoren umgesetzt so dass die Anpassung an Lua ist ziemlich gut gemacht. Eine PEG ermöglicht die Angabe von einfachen Mustern durch Grammatiken kompletter Sprache geschrieben werden. LPeg kompiliert die Grammatik zu einem Bytecode und führt sie extrem effizient.

Sie sollten nicht versuchen zu analysieren HTML mit regulären Ausdrücken, HTML und XML sind nicht reguläre Sprachen und kann nicht erfolgreich mit regulären Ausdrücken manipuliert werden. Sie sollten einen eigenen HTML-Parser verwenden. Hier gibt viele Erklärungen, warum .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top