2011-05-31 21 views
5

Sono nuovo alle caratteristiche regex equivalenza Lua, ho bisogno di scrivere la seguente espressione regolare, che dovrebbe corrispondere i numeri con decimaliCome scrivere questa espressione regolare in Lua?

\b[0-9]*.\b[0-9]*(?!]) 

In sostanza, corrisponde ai numeri in formato decimale (ad esempio: 1, 1.1, 0.1, 0.11), che non terminano con ']', ho cercato di scrivere un'espressione regolare come questa con Lua usando string.gmatch, ma sono abbastanza inesperto con le espressioni di corrispondenza Lua ...

Grazie!

+0

A proposito, la tua espressione regolare non corrisponde esattamente a ciò che vuoi che corrisponda. Corrisponde alla stringa vuota, ma non corrisponde a '.11'. –

+0

Risolto il problema, non era realmente necessario :) – Goles

+0

Inoltre non corrisponde a '0.11' ... si desidera un' * 'invece di'? 'Dopo il secondo' [0-9] ', penso. (E forse uno dei '*' è un '+' per evitare di far corrispondere la stringa vuota.) –

risposta

5

Lua non ha espressioni regolari, soprattutto perché un pieno regolare la libreria di espressioni sarebbe più grande di Lua stessa.

Cosa Lua ha invece sono matching patterns, che sono molto meno potente (ma ancora sufficiente per molti casi d'uso):

  • Non v'è alcun addetto al "limite di parola",
  • alternative,
  • e anche senza lookahead o simili.

Penso che non ci sia un modello Lua che corrisponda a tutte le possibili occorrenze della stringa, e nessun altro, il che significa che in qualche modo devi aggirare questo problema.

Il modello proposto da Stuart, %d*%.?%d*, corrisponde a tutti i numeri decimali (con o senza un punto), ma corrisponde anche alla stringa vuota, che non è molto utile. %d+%.?%d* corrisponde a tutti i numeri decimali con almeno una cifra prima del punto (o senza un punto), %d*%d.?%d+ corrisponde a tutti i numeri decimali con almeno una cifra dopo il punto (o senza un punto). %.%d+ corrisponde ai numeri decimali senza una cifra prima del punto.

Una soluzione semplice sarebbe cercare più di uno di questi modelli (ad esempio, sia %d+%.?%d* e %.%d+) e combinare i risultati. Poi guarda i luoghi in cui li hai trovati e guarda se c'è un "]" che li segue.


Ho sperimentato un po 'con lo frontier pattern.

Il modello %f[%.%d]%d*%.?%d*%f[^%.%d%]] partite tutti i numeri decimali che sono preceduti da qualcosa che non è né cifre né punto (o per nulla), e seguita da qualcosa che non è né ] né cifre né punto (o per niente). Tuttavia, corrisponde anche al singolo punto.

+1

C'è questo [modello di frontiera] (http://lua-users.org/wiki/FrontierPattern) che è "non ufficiale e non documentato" in 5.1 ma sarà in Lua 5.2. – jpjacobs

+0

Ne ho letto, ma come apparirebbe l'espressione usando il modello di frontiera sopra menzionato? – Goles

+0

@jpjacobs: Grazie, sembra carino. Ho aggiunto un esempio usando questo, ma non è ancora abbastanza. –

1

"%d*%.?%d+" corrisponderà a tutti questi numeri in formato decimale (si noti che mancheranno tutti i numeri firmati come -1.1 o +3.14). Avrete bisogno di trovare un'altra soluzione per evitare le istanze che terminano con ], come la rimozione di loro dalla stringa prima di cercare i numeri:

local pattern = "%d*%.?%d+" 
local clean = string.gsub(orig ,pattern .. "%]", "") 
return string.gmatch(clean, pattern) 
+0

Il pattern non corrisponderebbe anche alla stringa vuota? –

+0

D'oh, mi sono preso tutto il tempo per eguagliare la regex dell'OP che ho dimenticato di controllare. –

Problemi correlati