2013-08-07 33 views
5

Tôi đang cố gắng thực hiện một thư viện ở Lua với một số chức năng điều khiển chuỗi. Tôi muốn thực hiện một chức năng làm thay đổi trường hợp chữ cái thành chữ hoa trên các ký tự lẻ của từ đó.Thao tác chuỗi trong Lua: Viết hoa chữ cái lẻ lẻ

Đây là một ví dụ:

Input: This LIBRARY should work with any string! 
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg! 

Tôi đã thử với chức năng "gsub" nhưng tôi thấy nó thực sự khó khăn để sử dụng.

+2

Lưu ý: Ví dụ của bạn cũng thay đổi ký tự thành chữ thường! –

Trả lời

2

Thứ nhất, chia chuỗi thành một chuỗi các chữ:

local original = "This LIBRARY should work with any string!" 

local words = {} 
for v in original:gmatch("%w+") do 
    words[#words + 1] = v 
end 

Sau đó, thực hiện một chức năng để biến những từ như mong đợi, nhân vật kỳ quặc để phía trên, thậm chí nhân vật thấp hơn:

function changeCase(str) 
    local u = "" 
    for i = 1, #str do 
     if i % 2 == 1 then 
      u = u .. string.upper(str:sub(i, i)) 
     else 
      u = u .. string.lower(str:sub(i, i)) 
     end 
    end 
    return u 
end 

Sử dụng hàm để sửa đổi mọi từ:

for i,v in ipairs(words) do 
    words[i] = changeCase(v) 
end 

Cuối cùng, sử dụng table.concat để c oncatenate một chuỗi:

local result = table.concat(words, " ") 
print(result) 
-- Output: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg 
+1

Điều này giả định rằng mã hóa bộ ký tự chỉ có một byte cho mỗi ký tự. Nếu đó không phải là trường hợp sau đó một vấn đề bó đi vào chơi, bắt đầu với làm thế nào để tìm thấy tất cả các nhân vật khác. –

+0

@TomBlodget Chuỗi Lua là một chuỗi các byte. Xử lý Unicode trong Lua chính nó là một chủ đề rộng hơn nhiều để trả lời ở đây. –

1

Kể từ khi tôi đang mã hóa chủ yếu ở Haskell gần đây, giải pháp chức năng-ish nói đến cái tâm:

local function head(str) return str[1] end 
local function tail(str) return substr(str, 2) end 

local function helper(str, c) 
    if #str == 0 then 
     return "" 
    end 

    if c % 2 == 1 then 
     return toupper(head(str)) .. helper(tail(str),c+1) 
    else 
     return head(str) .. helper(tail(str), c+1) 
    end 
end 

function foo(str) 
    return helper(str, 1) 
end 

Disclaimer: Không kiểm tra, chỉ hiển thị các ý tưởng.


Và bây giờ thật, bạn có thể đối xử với một chuỗi như một danh sách các nhân vật với truy cập ngẫu nhiên với ngữ nghĩa tham khảo trên []. Đơn giản cho vòng lặp với chỉ số nên làm các trick chỉ tốt.

4

này gần như hoạt động:

original = "This LIBRARY should work with any string!" 
print(original:gsub("(.)(.)",function (x,y) return x:upper()..y end)) 

Nó không thành công khi chuỗi có chiều dài lẻ và char cuối cùng là một bức thư, như trong

original = "This LIBRARY should work with any strings" 

tôi sẽ để trường hợp đó như một bài tập.

+4

'kết quả = đầu vào: gsub ('(% S) (% S?)', Hàm (a, b) trả về a: upper() .. b: lower() end)' sẽ không thất bại trên độ dài lẻ. BTW, tôi thích điều này "boobs mẫu" quá :-) –

Các vấn đề liên quan