Domanda

E 'possibile realizzare in Lua?

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"

Il punto qui è la non accettazione delle dichiarazioni logiche 'o' nei modelli di Lua.


MODIFICARE: Appena realizzato che è possibile in questo modo:

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

Anche se logico 'o' per i modelli è ancora mancante.

È stato utile?

Soluzione

Lua non usa le espressioni regolari standard per il pattern matching. Una citazione dal libro Programmazione in Lua spiega il motivo:

  

A differenza di molti altri linguaggi di scripting, Lua non usa espressioni regolari POSIX (espressioni regolari) per il pattern matching. La ragione principale di ciò è formato: Una tipica implementazione di POSIX regexp richiede più di 4000 linee di codice. Questo è più grande di tutte le librerie standard Lua insieme. In confronto, l'implementazione di pattern matching in Lua ha meno di 500 linee. Naturalmente, il pattern matching in Lua non può fare tutto ciò che una piena attuazione POSIX fa. Tuttavia, pattern matching in Lua è uno strumento potente e include alcune caratteristiche che sono difficili da abbinare con le implementazioni POSIX standard.

Tuttavia, ci sono molti attacchi alle librerie di espressioni regolari esistenti e anche l'avanzata LPeg biblioteca. Per un elenco dei quali con collegamenti, vedere http://lua-users.org/wiki/LibrariesAndBindings, capitolo Text processing.

Inoltre, si veda questa domanda: Lua pattern matching contro le espressioni regolari

Altri suggerimenti

pattern matching non è la stessa come espressioni regolari, e non ha un alternanza concetto.

Ad esempio, se si voleva rimuovere "abc" o "efg" dalla fine di una stringa (simile a "(abc|efg)$" espressione regolare) il seguente codice dovrebbe funzionare bene:

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

Lua le espressioni regolari sono ... anormale. Per quanto posso dire dalla documentazione, non v'è alcun supporto per l'alternanza generale né per l'applicazione di operatori di ripetizione ai gruppi. Nel tuo caso, come dici tu, è possibile ottenere ciò che si vuole con una classe di caratteri (non sono sicuro di quello che la virgola sta facendo nella tua classe di caratteri, però).

Vedere qui: http://www.lua.org/ manuale / 5,1 / manual.html # 5.4.1

(In un progetto che ho usato per lavorare, abbiamo scritto il nostro legame con Lua PCRE a causa di questo.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top