Difference between revisions of "String exploding"
Parallax7d (talk | contribs) |
Parallax7d (talk | contribs) |
||
Line 30: | Line 30: | ||
</source> | </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 the | + | 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 the results back into the original string if it had extra delimiters. |
<source lang="lua"> | <source lang="lua"> |
Revision as of 01:04, 6 April 2015
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
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 the results back into the original string if it had extra delimiters.
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