Difference between revisions of "String exploding"

m (Added missing properties for the category page, the function itself "pollutes" lua's string table though.)
 
(7 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 following function is an alternative which will omit empty strings from the returned table if a delimiter(s) is leading or trailing the string being exploded.  This means it will return a more compact table in some cases where the input string has excessive delimiters.  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 21: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