Lua中如何将字符串转换为数字

4
在Lua中,我有一个字符串如下:231 523 402 1223 9043 -1 4,其中包含用空格分隔的几个数字。现在我想将它转换为整数向量,该如何使用一些内置函数来实现?
3个回答

6
您可以使用带有函数的 string.gsub 作为替换值。

如果 repl 是一个函数,则每次出现匹配时都会调用此函数,并按顺序将所有捕获的子字符串作为参数传递。

下面是一个使用示例:
local function tovector(s)
    local t = {}
    s:gsub('%-?%d+', function(n) t[#t+1] = tonumber(n) end)
    return t
end

使用它非常简单:
local t = tovector '231 523 402 1223 9043 -1 4'

结果是一个向量(或在Lua术语中称为序列):
for i,v in ipairs(t) do print(i,v) end

1       231
2       523
3       402
4       1223
5       9043
6       -1
7       4

3

使用 tonumber 将字符串转换为数字。 使用字符串模式从字符串中获取数字。 http://www.lua.org/manual/5.3/manual.html#pdf-string.gmatch

local example = "123 321 -2"
for strNumber in string.gmatch(example, "%-?%d+") do
  tonumber(strNumber)
end
%-将匹配减号,而%-?将可选匹配减号,换句话说,可能会有一个减号。 %d+将匹配由一个或多个连续数字组成的任何字符串段。
一旦您获得了数字,就可以将它们插入到Lua表中。 http://www.lua.org/manual/5.3/manual.html#pdf-table.insert

0
你可以将列表转换为以下代码。
return {231,523,402,1223,9043,-1,4}

让Lua来做繁重的工作:

s="231 523 402 1223 9043 -1 4"
t=loadstring("return {"..s:gsub("%s+",",").."}")()
for k,v in ipairs(t) do print(k,v) end

不,绝对不行。eval 在任何可以避免使用的地方都是不好的。 - Oleg V. Volkov
2
@OlegV.Volkov - 在将字符串传递给evil()函数之前,您可以通过将整个字符串与模式“^[-%d%s]+$”匹配来检查不受信任的字符串。您能否创建一个恶意字符串以匹配该模式?))) - Egor Skriptunoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接