2013-08-07 6 views
5

मैं लुआ में लाइब्रेरी करने के लिए कुछ फ़ंक्शन के साथ लाइब्रेरी करने की कोशिश कर रहा हूं जो तारों में हेरफेर करता है। मैं ऐसा फ़ंक्शन करना चाहता हूं जो अक्षर के मामले को शब्द के विषम वर्णों पर ऊपरी भाग में बदल देता है।लुआ में स्ट्रिंग मैनिपुलेशन: अजीब चार अपरकेस बनाएं

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

मैं "gsub" समारोह के साथ करने की कोशिश की, लेकिन मैं यह वास्तव में मुश्किल का उपयोग करने के लिए मिला:

यह एक उदाहरण है।

+2

नोट: आपका उदाहरण भी कम मामले में वर्ण बदलता है! –

उत्तर

2

पहले, शब्द की एक सरणी में स्ट्रिंग विभाजित:

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

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

फिर, एक समारोह कम करने की उम्मीद है, ऊपरी, यहां तक ​​कि पात्रों को अजीब पात्रों जैसे शब्दों चालू करने के लिए करते हैं:

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 

table.concat का उपयोग कर,

for i,v in ipairs(words) do 
    words[i] = changeCase(v) 
end 
अंत में

: हर शब्द को संशोधित करने के समारोह का उपयोग करना एक स्ट्रिंग के लिए oncatenate:

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

यह मानता है कि चरित्र सेट एन्कोडिंग में प्रति वर्ण केवल एक बाइट है। यदि ऐसा नहीं है तो एक गुच्छा समस्याएं खेलती हैं, शुरुआत से हर दूसरे चरित्र को कैसे ढूंढें। –

+0

@ टॉमब्लोडेट लुआ स्ट्रिंग बाइट्स का अनुक्रम है। लूआ में यूनिकोड प्रसंस्करण यहां जवाब देने के लिए एक बहुत अधिक विस्तृत विषय है। –

1

जब से मैं हाल ही में हास्केल में ज्यादातर कोडिंग कर रहा हूँ, कार्यात्मक-ish समाधान मन में आता है:

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 

अस्वीकरण: जांची नहीं, बस विचार को दर्शाता है।


और अब असली के लिए, आप [] पर संदर्भ अर्थ विज्ञान के साथ यादृच्छिक अभिगम के साथ वर्णों की एक सूची की तरह एक स्ट्रिंग इलाज कर सकते हैं। इंडेक्स के साथ लूप के लिए सरल चाल को ठीक करना चाहिए।

4

यह लगभग काम करता है:

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

यह विफल रहता है जब स्ट्रिंग अजीब लंबाई है और पिछले चार

original = "This LIBRARY should work with any strings" 

मैं के रूप में, एक पत्र है एक अभ्यास के रूप में उस मामले को छोड़ देंगे।

+4

'परिणाम = इनपुट: जीएसयूबी ('(% एस) (% एस?)', फ़ंक्शन (ए, बी) एक लौटाएं: ऊपरी() .. बी: निचला() अंत) 'अजीब लंबाई पर असफल नहीं होगा। बीटीडब्ल्यू, मुझे यह "स्तन पैटर्न" भी पसंद है :-) –

संबंधित मुद्दे