2012-05-05 19 views
12

Voglio rimuovere tutti gli spazi da una stringa in Lua. Questo è quello che ho provato:Come rimuovere gli spazi da una stringa in Lua?

string.gsub(str, "", "") 
string.gsub(str, "% ", "") 
string.gsub(str, "%s*", "") 

Questo non sembra funzionare. Come posso rimuovere tutti gli spazi?

risposta

27

Funziona, è sufficiente assegnare il risultato effettivo/il valore restituito. Utilizzare uno dei seguenti variazioni:

str = str:gsub("%s+", "") 
str = string.gsub(str, "%s+", "") 

Io uso %s+ quanto non v'è alcun punto in sostituzione delle partite vuota (cioè non c'è spazio). Questo non ha alcun senso, quindi cerco almeno un carattere di spazio (usando il quantificatore +).

+1

Non hai davvero bisogno di usare +, non corrisponderà a non spazio se usi solo% s. L'uso di% s sembra più comune, anche se suppongo che il risultato finale sia lo stesso. – sylvanaar

+0

Il risultato finale sarà lo stesso, ma con '+' sostituirai gli spazi l'uno dopo l'altro in una volta, il che potrebbe essere più performante (non sono sicuro che sia davvero importante in Lua). – Mario

+0

Nemmeno io. Merita solo una menzione. – sylvanaar

3

Il modo più veloce è quello di utilizzare trim.so compilato da trim.c:

/* trim.c - based on http://lua-users.org/lists/lua-l/2009-12/msg00951.html 
      from Sean Conner */ 
#include <stddef.h> 
#include <ctype.h> 
#include <lua.h> 
#include <lauxlib.h> 

int trim(lua_State *L) 
{ 
const char *front; 
const char *end; 
size_t  size; 

front = luaL_checklstring(L,1,&size); 
end = &front[size - 1]; 

for (; size && isspace(*front) ; size-- , front++) 
    ; 
for (; size && isspace(*end) ; size-- , end--) 
    ; 

lua_pushlstring(L,front,(size_t)(end - front) + 1); 
return 1; 
} 

int luaopen_trim(lua_State *L) 
{ 
lua_register(L,"trim",trim); 
return 0; 
} 

compilare qualcosa di simile:

gcc -shared -fpic -O -I/usr/local/include/luajit-2.1 trim.c -o trim.so 

più dettagliate (con rispetto agli altri metodi): http://lua-users.org/wiki/StringTrim

Utilizzo:

local trim15 = require("trim")--at begin of the file 
local tr = trim(" a z z z z z ")--anywhere at code 
1

si utilizza la seguente funzione:

function all_trim(s) 
    return s:match"^%s*(.*)":match"(.-)%s*$" 
end 

o più corto:

function all_trim(s) 
    return s:match("^%s*(.-)%s*$") 
end 

utilizzo:

str=" aa " 
print(all_trim(str) .. "e") 

uscita è:

aae 
+0

O anche più corto e in una volta sola: 's: match (" ^% s * (.-)% s * $ ")'. – siffiejoe

+0

Ho usato il tuo suggerimento, ma ottengo il 'stdin: 1: tentativo di concatenare un valore nil' – PersianGulf

+0

Il codice che ho dato funziona e non produce mai' nil' come risultato per qualsiasi stringa di input. Hai restituito il risultato? O hai dimenticato le virgolette attorno a "" e "'? – siffiejoe

0

Per LuaJIT tutti i metodi di Lua wiki (ad eccezione, forse, nativi di C/C++) sono stati terribilmente lenti nei miei test. Questa implementazione ha mostrato le migliori prestazioni:

function trim (str) 
    if str == '' then 
    return str 
    else 
    local startPos = 1 
    local endPos = #str 

    while (startPos < endPos and str:byte(startPos) <= 32) do 
     startPos = startPos + 1 
    end 

    if startPos >= endPos then 
     return '' 
    else 
     while (endPos > 0 and str:byte(endPos) <= 32) do 
     endPos = endPos - 1 
     end 

     return str:sub(startPos, endPos) 
    end 
    end 
end -- .function trim 
Problemi correlati