2012-05-05 206 views
12

我想從Lua中的字符串中刪除所有空格。這是我曾嘗試過的:如何從Lua中的字符串中刪除空格?

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

這似乎不起作用。我怎樣才能刪除所有的空間?

回答

27

它的工作原理,你只需要分配實際的結果/返回值。使用下面的變型中的一個:

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

我使用%s+作爲有在更換空的匹配(即,沒有空間)沒有意義的。這只是沒有任何意義,所以我尋找至少一個空格字符(使用+量詞)。

+1

您確實不需要使用+,如果您只是使用%s,它不會匹配非空格。使用%s似乎更常見 - 儘管我猜最終結果是一樣的。 – sylvanaar

+0

最終結果將是相同的,但用'+'你會替換空格在一次可能會更高性能(不確定它是否真的在Lua中很重要)。 – Mario

+0

我也沒有。值得一提。 – sylvanaar

3

最快的方法是使用trim.so從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; 
} 

編譯類似:

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

更詳細的(有比較其它方法):http://lua-users.org/wiki/StringTrim

用法:

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

您使用以下功能:

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

或更短:

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

用法:

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

輸出是:

aae 
+0

甚至更​​短,一次性:'s:match(「^%s *(.-)%s * $」)'。 – siffiejoe

+0

我使用了你的suggesstion,但是我得到'stdin:1:試圖連接一個零值' – PersianGulf

+0

我給出的代碼工作並且從不產生任何輸入字符串的結果'nil'。你是否返回結果?或者你忘了''e「'的引號? – siffiejoe

0

對於LuaJIT,來自Lua wiki的所有方法(可能是本機C/C++除外)在我的測試中都非常慢。此實現顯示了最佳性能:

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