如何从字符串中正确匹配出小数(带符号)字符串?
使用 string.gmatch
说明见官方文档,摘录如下:
string.gmatch (s, pattern)
Returns an iterator function that, each time it is called, returns the next captures from pattern
over string s
.
If pattern
specifies no captures, then the whole match is produced in each call.
As an example, the following loop
s = "hello world from Lua" for w in string.gmatch(s, "%a+") do print(w) end
will iterate over all the words from string s
, printing one per line. The next example collects all pairs key=value
from the given string into a table:
t = {} s = "from=world, to=Lua" for k, v in string.gmatch(s, "(%w+)=(%w+)") do t[k] = v end
例子:
local numberT = {}
local paramStr = '[2.04523,-3.4901,12030.39458,20]'
for k in string.gmatch(paramStr, '(%-?%d+%.*%d*)') do
table.insert(numberT, tonumber(k))
end
for _, v in ipairs(numberT) do
print('type(v)='..type(v), 'v='..v)
end
--运行结果为:
type(v)=number v=2.04523
type(v)=number v=-3.4901
type(v)=number v=12030.39458
type(v)=number v=20
--上述中的模式串带小括号(),表示一个匹配结果中需要符合我们所定义的匹配方式(%-?%d+%.*%d*)
--总结:碰到lua中的特殊字符(比如 . / % - + ? 等等)需要先用%作为转义字符,
--比如上面的模式串 (%-?%d+%.*%d*) 分为 %-? %d+ %.* %d*
-- %-? %是转义了后面跟着的- 而?表示匹配0或1个,亦即匹配0或1个-
-- %d+ %d表示匹配数字 跟着+号表示匹配1或者多个数字
-- %.* %是转义了后面跟着的. 跟着的*号表示匹配0到多个.
-- %d* 表示匹配0或者多个数字