提问人:user2316707 提问时间:7/30/2023 最后编辑:Okauser2316707 更新时间:7/30/2023 访问量:32
嵌套的 string.gmatch 语法格式
nested string.gmatch syntax format
问:
我正在为一些嵌套的 gmatch 函数而苦苦挣扎(使用等效的 Lua 代码)
假设我有 (3) 个结构,每个结构都可以提高随机技能动作;
["building1"] = { effect = "+1 Improve Lifestyle, +1 Quell Unrest (Magic), random note"},
["building2"] = { effect = "+2 Hire Adventurers, +1 Trade Commodities"},
["building3"] = { effect = "just some random notes"}
为简单起见,我有一个循环循环浏览每条记录......它将效果数据捕获到“sEffects”中。 然后,我尝试使用 gmatch 将其拆分......查找(加号),后跟(数字)和(空格)。
我可以使用以下命令将文本拆分为几行;
for sLine in string.gmatch(sEffects, "([^,]+)") do
nCount = nCount +1;
Debug.chat("line " .. nCount .. " = " .. sLine);
生成以下输出;
line 1 = +1 Improve Lifestyle
line 2 = +1 Quell Unrest (Magic)
Line 3 = random note
Line 1 = +2 Hire Adventurers
Line 2 = +1 Trade Commodities
Line 1 = just some random notes
但是,我需要将其分为(奖金)和(技能)......同时排除任何不以“+”(数字)开头的行。
像这样的东西;
bonus=1, skill=Improve Lifestyle
bonus=1, skill=Quell Unrest (Magic)
bonus=2, skill=Hire Adventurers
bonus=1, skill=Trade Commodities
它捕获(奖励)和(技能),同时忽略所有其他数据。
也许是这样的东西(如果我能弄清楚 gmatch 语法)
for bonus, skill in string.gmatch(sLine, "([^+%d]+)") do
Debug.chat("bonus= " .. bonus);
Debug.chat("skill= " .. skill);
end
如何格式化 gmatch 搜索,使其执行以下操作?
- 忽略任何没有“+”的行
- 忽略“+”前面的空格
- 返回“+”符号后的小数作为第一个变量
- 将 (+)(decimal)(空格) 后面的行余部分作为第二个变量返回
答:
0赞
user2316707
7/30/2023
#1
既然我已经说明了这个问题,那么我想我找到了解决它的方法。
local pos = string.find(sLine, "+");
if pos == nil then
-- do nothing
else
local sEnd = string.len(sLine);
nBonus = tonumber(string.sub(sLine, pos+1, pos +1))
sAction = string.sub(sLine, pos+3, sEnd)
Debug.chat("bonus=" .. nBonus .. ", skill=" .. sAction .. "]");
end
首先,我检查 sLine 是否包含加号......这解决了#1
要解决 #2 和 #3 ...我使用返回的位置 +1 来分配 nBonus
对于#4 ...我可以使用位置返回 +3(所以它也会跳过数字后面的空格)......并让它返回所有内容,直到行尾。
现在它返回以下内容;
bonus=1, skill=Improve Lifestyle
bonus=1, skill=Quell Unrest (Magic)
bonus=2, skill=Hire Adventurers
bonus=1, skill=Trade Commodities
0赞
dt192
7/30/2023
#2
假设没有一个技能名称包含逗号,这样的东西应该可以工作。
for bonus,skill in str:gmatch('%+(%d+) ([^,]+)') do
print(bonus, skill)
end
Result:
1 Improve Lifestyle
1 Quell Unrest (Magic)
下一个:为命名向量填写 0
评论
local bonus, skill = sLine:match("%+(%d+)%s+(.*)")