2012-05-05 25 views
12

Quiero eliminar todos los espacios de una cadena en Lua. Esto es lo que he intentado:¿Cómo eliminar espacios de una cadena en Lua?

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

Esto no parece funcionar. ¿Cómo puedo eliminar todos los espacios?

Respuesta

27

Funciona, solo tiene que asignar el valor real de resultado/retorno. Utilice una de las siguientes variaciones:

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

utilizo %s+ como no hay ningún punto en la sustitución de un partido de vacío (es decir, no hay espacio). Esto simplemente no tiene ningún sentido, así que busco al menos un carácter de espacio (usando el cuantificador +).

+1

Realmente no necesita usar +, no coincidirá con el espacio si solo usa% s. Usar% s parece ser más común, aunque supongo que el resultado final es el mismo. – sylvanaar

+0

El resultado final será el mismo, pero con '+' reemplazará espacios uno detrás del otro de una vez, lo que podría ser más eficaz (no estoy seguro si realmente importa en Lua). – Mario

+0

Ni yo tampoco. Solo vale la pena mencionarlo. – sylvanaar

3

La forma más rápida es utilizar trim.so compilado a partir de 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; 
} 

compilar algo como:

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

más detallada (con respecto a los otros métodos): http://lua-users.org/wiki/StringTrim

Uso:

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

utiliza la siguiente función:

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

o más corto:

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

uso:

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

de salida es:

aae 
+0

O incluso más corto y de una vez: 's: match (" ^% s * (.-)% s * $ ")'. – siffiejoe

+0

Utilicé su sugerencia pero obtengo el 'stdin: 1: intento de concatenar un valor nulo' – PersianGulf

+0

El código que di funciona y nunca produce' nil' como resultado para ninguna cadena de entrada. ¿Devolvió el resultado? ¿O te olvidaste de las comillas que rodean '" e "'? – siffiejoe

0

Para LuaJIT todos los métodos de Lua wiki (excepto, posiblemente, C/C++ nativo) fueron terriblemente lentos en mis pruebas. Esta implementación mostró el mejor rendimiento:

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 
Cuestiones relacionadas