我是 Lua 编程的新手,从 python 转过来,主要是为 friend 制作一个魔兽世界的小插件。我正在研究从相当大的纯文本字符串中查找文本部分的各种方法。我需要从文本中提取我需要的信息,然后以通常的方式处理它。
文本字符串可以是任何数字,但是下面是我们要提取和处理的内容
-- GSL --
items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,]
-- ENDGSL --
我们希望从周围可能较大的文本 block 中剥离整个文本 block ,然后删除 -- GSL -- 和 -- ENDGSL -- 留下:
items = ["itemdid":"qty …
我研究了各种方法,但似乎无法理解其中的任何一种。
有人对解决这个问题的最佳方法有什么建议吗?
编辑:其他问题,
根据已接受的答案,我将代码稍微更改为以下内容。
function GuildShoppingList:GUILDBANKFRAME_OPENED()
-- Actions to be taken when guild bank frame is opened.
if debug == "True" then self:Print("Debug mode on, guild bank frame opened") end
gslBankTab = GetCurrentGuildBankTab()
gslBankInfo = GetGuildBankText(gslBankTab)
p1 = gslBankInfo:match('%-%- GSL %-%-%s+(.*)%s+%-%- ENDGSL %-%-')
self:Print(p1)
end
字符串现在略有变化,我们正在解析的信息是
{itemid:qty, itemid:qty, itemid:qty, itemid:qty}
现在,这是在 p1 中调用的字符串。我需要更新 s:match 方法来删除 { } ,并迭代每个项目及其由 分隔的键,所以我只剩下
itemid:qty
itemid:qty
itemid:qty
itemid:qty
然后我可以单独识别每一行并将其放置在需要的位置。
最佳答案
尝试
s=[[-- GSL --
items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,]
-- ENDGSL --]]
print(s:match('%-%- GSL %-%-%s+(.*)%s+%-%- ENDGSL %-%-'))
关键可能是 -
是一个模式修饰符,如果您想要文字连字符,则需要引用它。有关模式的更多信息 in the Lua Reference Manual, chapter 5.4.1
编辑: 对于循环遍历几乎是数组的键的附加问题,您可以做两件事:
将其作为字符串循环,假设键和数量都是整数:
p="{1:10, 2:20, 3:30}"
for id,qty in p:gmatch('(%d+):(%d+)') do
--do something with those keys:
print(id,qty)
end
或者稍微改变一下字符串,将其作为Lua表进行评估:
p="{1:10, 2:20, 3:30}"
p=p:gsub('(%d+):','[%1]=') -- replace : by = and enclose keys with []
t=loadstring('return '..p)() -- at this point, the anonymous function
-- returned by loadstring get's executed
-- returning the wanted table
for k,v in pairs(t) do
print(k,v)
end
如果键或数量的格式不仅仅是整数,那么在模式中更改它应该是微不足道的。
关于arrays - 用于查找和替换文本的 Lua 字符串库选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211785/