2012-05-05 27 views
12

Tôi muốn xóa tất cả dấu cách khỏi một chuỗi trong Lua. Đây là những gì tôi đã thử:Làm cách nào để xóa dấu cách khỏi chuỗi trong Lua?

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

Điều này dường như không hoạt động. Làm thế nào tôi có thể loại bỏ tất cả các không gian?

Trả lời

27

Nó hoạt động, bạn chỉ cần gán giá trị kết quả/trả lại thực tế. Sử dụng một trong các biến thể sau đây:

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

tôi sử dụng %s+ như không có điểm nào trong việc thay thế một trận trống (ví dụ: không có khoảng trắng). Điều này không có ý nghĩa gì cả, vì vậy tôi tìm ít nhất một ký tự khoảng trắng (sử dụng bộ định lượng +).

+1

Bạn thực sự không cần sử dụng dấu +, nó sẽ không khớp với không gian nếu bạn chỉ sử dụng% s. Sử dụng% s có vẻ phổ biến hơn - mặc dù tôi đoán kết quả cuối cùng cũng giống nhau. – sylvanaar

+0

Kết quả cuối cùng sẽ giống nhau, nhưng với '+' bạn sẽ thay thế khoảng trống theo nhau trong một lần có thể có hiệu suất cao hơn (không thực sự chắc chắn nếu nó thực sự quan trọng trong Lua). – Mario

+0

Không phải tôi. Chỉ đáng nói đến. – sylvanaar

3

Cách nhanh nhất là sử dụng trim.so biên soạn từ 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; 
} 

biên dịch một cái gì đó như:

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

chi tiết hơn (với so với các phương pháp khác): http://lua-users.org/wiki/StringTrim

Cách sử dụng:

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

Bạn sử dụng các chức năng sau:

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

Hoặc ngắn:

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

sử dụng:

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

Output là:

aae 
+0

Hoặc thậm chí ngắn hơn và trong một lần: 's: match (" ^% s * (.-)% s * $ ")'. – siffiejoe

+0

Tôi sử dụng suggesstion của bạn nhưng tôi nhận được 'stdin: 1: cố gắng ghép một giá trị nil ' – PersianGulf

+0

Mã tôi đã cung cấp tác phẩm và không bao giờ tạo' nil' như là kết quả cho bất kỳ chuỗi đầu vào nào. Bạn đã trả lại kết quả chưa? Hay bạn đã quên dấu ngoặc kép quanh '" e "'? – siffiejoe

0

Đối với LuaJIT, tất cả các phương pháp từ Lua wiki (ngoại trừ, có thể, bản địa C/C++) đều chậm trong các thử nghiệm của tôi. Triển khai này cho thấy hiệu suất tốt nhất:

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 
Các vấn đề liên quan