Frage

Ich lerne derzeit lua. in Bezug auf Pattern-Matching in lua fand ich den folgenden Satz in der lua Dokumentation auf lua.org:

  

Dennoch, Pattern-Matching in Lua ist ein mächtiges Werkzeug und enthält einige Funktionen, die nur schwer mit Standard-POSIX-Implementierungen entsprechen.

Als ich mit Posix regulären Ausdrücken vertraut bin würde ich gerne wissen, ob es irgendwelche gemeinsamen Proben, wo lua Mustervergleich ist „besser“ im Vergleich zu regulärem Ausdruck - oder habe ich den Satz falsch interpretieren? und wenn es keine gemeinsame Beispiele sind: Warum ist jeder von Pattern-Matching gegen reguläre Ausdrücke besser geeignet

?
War es hilfreich?

Lösung

  

Gibt es gemeinsame Proben, bei denen lua Pattern-Matching „besser“ im Vergleich zu regulärem Ausdruck?

Es ist nicht so sehr besondere Beispiele wie Lua Muster ein höheres Signal-zu-Rausch-Verhältnis als POSIX reguläre Ausdrücke. Es ist das gesamte Design, die oft vorzuziehen ist, nicht besondere Beispiele.

Hier sind einige Faktoren, die zum guten Design beitragen:

  • Sehr leichte Syntax für zusammenpassende gemeinsame Zeichentypen einschließlich Großbuchstaben (%u), Dezimalziffern (%d), Leerzeichen (%s) und so weiter. Jeder Zeichentyp kann unter Verwendung des entsprechenden Großbuchstaben ergänzt werden, so Muster %S paßt auf jedes Zeichen nach Leerzeichen.

  • Zitiert ist extrem einfach und regelmäßig. Der zitierte Charakter ist %, so dass er aus dem String-Zitat Charakter \ immer verschieden ist, die viel einfacher Lua Muster macht als POSIX zu lesen regulären Ausdrücken (bei Angabe erforderlich). Es ist immer sicherer Symbole zu zitieren, und es ist nie notwendig Briefe zu zitieren, so dass Sie nur von dieser Faustregel gilt: statt Auswendiglernen, welche Symbole sind spezielle Meta-Zeichen.

  • gehen
  • Lua bietet „erfasst“ und mehrere Aufnahmen als Ergebnis eines match zurückrufen kann. Diese Schnittstelle ist viel, viel besser als Substrings durch Nebenwirkungen oder mit einigen versteckten Zustand erfasst, die Aufnahmen finden abgefragt werden muss. Capture-Syntax ist einfach:. Nur Gebrauch Klammern

  • Lua hat eine „kürzeste Spiel“ - Modifikator mit der „längsten Übereinstimmung“ * Betreiber zu gehen. So zum Beispiel s:find '%s(%S-)%.' findet die kürzeste Folge von Zeichen nach Leerzeichen, die von Raum und gefolgt von einem Punkt vorangestellt ist.

  • Die Ausdruckskraft der Lua-Muster ist vergleichbar mit POSIX „basic“ reguläre Ausdrücke, ohne den Wechsel Operator |. Was Sie Aufgeben wird „erweitert“ reguläre Ausdrücke mit |. Wenn Sie diese viel Ausdruckskraft benötigen empfehle, ich den ganzen Weg zu LPEG das gibt Ihnen im wesentlichen die Macht der kontextfreien Grammatiken zu durchaus vernünftigen Preis.

Andere Tipps

http://lua-users.org/wiki/LibrariesAndBindings enthält eine Auflistung der Funktionen einschließlich regex Bibliotheken, wenn Sie mit ihnen fortsetzen möchten.

Um die Frage zu beantworten (und beachten Sie, dass ich keineswegs ein Lua-Guru bin), hat die Sprache eine starke Tradition des in Embedded-Anwendungen eingesetzt werden, wo ein vollständiges Regex-Engine die Größe des Codes übermäßig erhöhen würde, dass verwendet auf der Plattform, manchmal viel größer als nur all die Lua Bibliothek selbst.

[Bearbeiten] Ich habe gerade in der Online-Version der gefundenen Programmierung in Lua (eine hervorragende Ressource für das Erlernen der Sprache), wo diese von einem der Prinzipien der Sprache beschrieben: siehe die Kommentare unten [/ Edit]

Ich persönlich finde, dass die Standardmustervergleich Lua erfüllt die meisten meiner regex-y Bedürfnisse zur Verfügung stellt. Ihre Ergebnisse können variieren.

Ok, nur eine leichte Noob Note für diese Diskussion; Ich habe besonders von dieser Seite verwechselt:

SciTE Reguläre Ausdrücke

da, dass man sagt \s Streichhölzer Leerzeichen, wie ich von anderen regulären Ausdruck Syntaxen wissen ... Und so habe ich es in einer Schale bin versucht:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

Hmmm ... scheint \s hier nicht anerkannt bekommen - so dass Seite wahrscheinlich zu den regulären Ausdruck bezieht sich in Scite des Suchen / Ersetzen - nicht zu Lua regex Syntax (die auch Anwendungen scite).

Dann habe ich reread lua-Benutzer wiki: Patterns Tutorial , und starten Sie den Kommentar bekommen über das Escape-Zeichen Wesen %, nicht \ in @NormanRamsey 's Antwort. Also, versuchen diese:

> print("_".. c:match("[%s]*") .."_")
_   _

... in der Tat arbeiten.

So, wie ich ursprünglich dachte, dass Lua „Muster“ sind verschiedene Befehle / Motor von Lua „regulären Ausdruck“, denke ich, einen besseren Weg, es zu sagen ist: Lua „Muster“ sind die Lua -spezifische „regulärer Ausdruck“ Syntax / Motor (mit anderen Worten, es gibt nicht zwei von ihnen :))

Cheers!

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