Domanda

Al momento sto imparando lua. per quanto riguarda pattern-matching in lua ho trovato la seguente frase nella documentazione lua su lua.org:

  

Tuttavia, il pattern matching in Lua è uno strumento potente e include alcune caratteristiche che sono difficili da abbinare con le implementazioni POSIX standard.

Come ho familiarità con le espressioni regolari POSIX Vorrei sapere se ci sono dei campioni comuni dove modello lua corrispondenza è "migliore" rispetto a un'espressione regolare - o ho interpretare male la frase? e se ci sono esempi comuni: il motivo per cui è una delle pattern-matching contro le espressioni regolari più adatto

?
È stato utile?

Soluzione

  

sono dei campioni comuni dove lua pattern matching è "migliore" rispetto a espressioni regolari?

Non è tanto particolari esempi, che i modelli Lua hanno un alto rapporto segnale-rumore di espressioni regolari POSIX. È il disegno complessivo che è spesso preferibile, non esempi particolari.

Qui ci sono alcuni fattori che contribuiscono alla buona progettazione:

  • sintassi molto leggero per corrispondenza tipi di caratteri comuni tra cui lettere maiuscole lettere (%u), cifre decimali (%d), caratteri di spazio (%s) e così via. Qualsiasi tipo di carattere può essere integrata utilizzando la lettera maiuscola corrispondente, in modo da modello %S corrisponde a qualsiasi carattere non-spazio.

  • Citando è estremamente semplice e regolare. Il carattere citare è %, quindi è sempre distinta dal \ carattere stringa apici, che rende modelli Lua molto più facile da leggere rispetto POSIX espressioni regolari (ove citare è necessario). E 'sempre sicuro di citare i simboli, e non è mai necessario citare le lettere, quindi si può solo andare da quella regola del pollice invece di memorizzazione quali simboli sono metacaratteri speciali.

  • offerte Lua "cattura" e in grado di restituire più cattura come il risultato di una chiamata match. Questa interfaccia è molto, molto meglio di cattura stringhe attraverso effetti collaterali o che hanno qualche stato nascosto che deve essere interrogato per trovare cattura. sintassi Capture è semplice:. Basta usare parentesi

  • Lua ha un "breve incontro" - modificatore di andare avanti con la "partita più lunga" operatore *. Così, per esempio s:find '%s(%S-)%.' trova la sequenza più breve di caratteri non-spazio che è preceduta da spazio e seguito da un punto.

  • La forza espressiva di modelli Lua è paragonabile a POSIX espressioni regolari "base", senza | operatore alternanza. Quello che si stanno dando up è "esteso" espressioni regolari con |. Se avete bisogno di così tanto potere espressivo Consiglio di andare fino in fondo a LPEG che vi dà sostanzialmente il potere delle grammatiche context-free a un costo abbastanza ragionevole.

Altri suggerimenti

http://lua-users.org/wiki/LibrariesAndBindings contiene un elenco di funzionalità comprese le librerie regex se si desidera continuare a utilizzarli.

Per rispondere alla domanda (e la nota che io sono in alcun modo un guru Lua), il linguaggio ha una forte tradizione di essere utilizzato in applicazioni embedded, in cui un motore completo regex sarebbe indebitamente aumentare la dimensione del codice in uso sulla piattaforma, a volte molto più grande di appena tutta la libreria Lua stesso.

[Modifica] Ho appena trovato nella versione online di Programmazione in Lua (una risorsa eccellente per l'apprendimento della lingua), dove questo è descritto da uno dei principi della lingua: vedere i commenti qui sotto [/ Modifica]

Trovo personalmente che il modello di default di corrispondenza Lua fornisce soddisfa la maggior parte dei miei bisogni regex-y. La vostra situazione potrebbe essere diversa.

Ok, solo una leggera nota niubbo per questa discussione; In particolare mi sono confuso da questa pagina:

SciTE espressioni regolari

dal momento che uno dice partite \s spazi bianchi, come so da altre sintassi delle espressioni regolari ... E così sto cercando in un guscio:

$ 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 ... sembra \s non viene riconosciuto qui - in modo che la pagina si riferisce probabilmente alla espressione regolare in Trova di Scite / Sostituisci - non la sintassi regex di Lua (che SciTE anche usi).

Poi ho riletto lua-users wiki: Patterns Tutorial , e iniziare a ricevere il commento su il carattere di escape essere %, non \ in @NormanRamsey 's risposta. Quindi, provare questo:

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

... effettivamente funziona.

Quindi, come ho inizialmente pensato che "pattern" di Lua sono diversi comandi / motore da "espressioni regolari" di Lua, credo che un modo migliore per dire che è: "modelli" di Lua sono il Lua SPECIFICI sintassi "espressioni regolari" / motore (in altre parole, non ci sono due di loro :))

Cheers!

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