Frage Logisch oder in Lua-Mustern?


Ist es möglich, in Lua zu erreichen?

local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"

local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"

Der Punkt hier ist die fehlende Akzeptanz von logischen "oder" Aussagen in Lua-Mustern.


BEARBEITEN: Habe gerade erkannt, dass dies möglich ist:

strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")

Obwohl logisch oder für Muster noch fehlt.


9
2017-08-11 20:09


Ursprung


Antworten:


Lua verwendet keine regulären Ausdrücke für die Mustererkennung. Ein Zitat aus dem Buch Programmierung in Lua erklärt den Grund:

Im Gegensatz zu mehreren anderen Skriptsprachen verwendet Lua keine regulären POSIX-Ausdrücke (regexp) für die Mustererkennung. Der Hauptgrund hierfür ist die Größe: Eine typische Implementierung von POSIX regexp benötigt mehr als 4.000 Zeilen Code. Dies ist größer als alle Lua-Standardbibliotheken zusammen. Im Vergleich dazu hat die Implementierung des Mustervergleichs in Lua weniger als 500 Zeilen. Natürlich kann der Mustervergleich in Lua nicht alles, was eine vollständige POSIX-Implementierung tut. Dennoch ist die Mustererkennung in Lua ein leistungsfähiges Werkzeug und enthält einige Funktionen, die mit Standard-POSIX-Implementierungen nur schwer zu erreichen sind.

Es gibt jedoch viele Bindungen zu vorhandenen Bibliotheken für reguläre Ausdrücke und auch zu den erweiterten LPeg Bibliothek. Für eine Liste von ihnen mit Links, siehe http://lua-users.org/wiki/LibrariesAndBindings, Kapitel Text processing.

Siehe auch diese Frage: Lua Mustervergleich gegen reguläre Ausdrücke


7
2017-08-13 09:57



Lua Mustererkennung ist nicht das Gleiche wie reguläre Ausdrücke und hat kein alternatives Konzept.

Zum Beispiel, wenn Sie entfernen wollten "abc" oder "efg" vom Ende einer Zeichenkette (ähnlich wie "(abc|efg)$" regulärer Ausdruck) würde der folgende Code gut funktionieren:

local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
  s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg

3
2017-08-11 23:07



Lua reguläre Ausdrücke sind ... abnormal. Soweit ich es aus der Dokumentation ersehen kann, gibt es keine Unterstützung für den generellen Wechsel oder die Anwendung von Wiederholungsoperatoren auf Gruppen. In Ihrem Fall, wie Sie sagen, können Sie mit einer Zeichenklasse bekommen, was Sie wollen (ich bin mir nicht sicher, was das Komma in Ihrer Zeichenklasse tut).

Siehe hier: http://www.lua.org/manual/5.1/manual.html#5.4.1

(In einem Projekt, an dem ich gearbeitet habe, haben wir deswegen unsere eigene Lua-Bindung an PCRE geschrieben.)


0
2017-08-11 22:17