Difference between revisions of "String exploding"

m (Added missing properties for the category page, the function itself "pollutes" lua's string table though.)
 
(4 intermediate revisions by 2 users not shown)
Line 28: Line 28:
 
original = table.concat(tbl, " ")
 
original = table.concat(tbl, " ")
 
print(original) --> foo bar
 
print(original) --> foo bar
</source>
 
 
The above function will potentially return a list peppered with empty strings if the original input string has leading, trailing or repeated delimiters.  The following function is an alternative which will return a more compact table with these empty strings omitted.  Due to these omissions, you won't be able to use table.concat to reverse it back into the original string.
 
 
<source lang="lua">
 
function string.explode2(s, d)
 
  local t = {}
 
    repeat
 
      local pos1, pos2 = string.find(s, d)
 
      t[#t + 1] = string.sub(s, 1, pos1 - 1)
 
      s = string.sub(s, pos2 + 1)
 
    until pos1 == nil
 
    if #s ~= 0 then t[#t + 1] = s end
 
  return t
 
end
 
 
</source>
 
</source>
 
[[Category:Snippets]]
 
[[Category:Snippets]]
 +
{{#set:LOVE Version=any}}
 +
{{#set:Description=Add the ability to explode strings. (return them as a table along defined divider substrings)}}

Latest revision as of 19:11, 11 November 2016

This function adds the ability to explode strings in Lua.

function string.explode(str, div)
    assert(type(str) == "string" and type(div) == "string", "invalid arguments")
    local o = {}
    while true do
        local pos1,pos2 = str:find(div)
        if not pos1 then
            o[#o+1] = str
            break
        end
        o[#o+1],str = str:sub(1,pos1-1),str:sub(pos2+1)
    end
    return o
end

Have an example:

tbl = string.explode("foo bar", " ")
print(tbl[1]) --> foo
-- since we added explode to the string table, we can also do this:
str = "foo bar"
tbl2 = str:explode(" ")
print(tbl2[2]) --> bar
-- to restore the original string, we can use Lua's table.concat:
original = table.concat(tbl, " ")
print(original) --> foo bar