Arrays 查找和替换文本的Lua字符串库选项

Arrays 查找和替换文本的Lua字符串库选项,arrays,string,lua,string-matching,Arrays,String,Lua,String Matching,我是Lua编程新手,从python过来,主要是为一个朋友为魔兽世界制作一个小插件。我正在研究从一个相当大的纯文本字符串中找到一段文本的各种方法。我需要从我需要的文本中提取信息,然后以通常的方式进行处理 文本字符串可以是许多任何内容,但是下面是我们要提取和处理的内容 -- GSL -- items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,] -- ENDGSL -- 我们希望从它周围的一个可能很大的文本块中剥离整个文本块,然后删除要保

我是Lua编程新手,从python过来,主要是为一个朋友为魔兽世界制作一个小插件。我正在研究从一个相当大的纯文本字符串中找到一段文本的各种方法。我需要从我需要的文本中提取信息,然后以通常的方式进行处理

文本字符串可以是许多任何内容,但是下面是我们要提取和处理的内容

-- GSL --
items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,]
-- ENDGSL --
我们希望从它周围的一个可能很大的文本块中剥离整个文本块,然后删除要保留的--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 %-%-'))
关键可能是
-
是一个模式修饰符,如果需要文字连字符,就需要引用它。更多关于模式的信息

编辑: 对于通过几乎是一个数组的键进行循环的附加问题,您可以做两件事:

假设key和quantity都是整数,则将其作为字符串进行循环:

 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

如果键或数量的格式不是简单的整数,那么在模式中更改它应该很简单。

很棒的东西,谢谢您的参考。我将仔细阅读这篇文章。:)我已经更新了这个问题,让它更深入一点,我想要的最终结果是什么。请你看一下好吗?谢谢你的更新,只是一张便条。第一种选择非常有效。第二个选项似乎生成了一个错误,当p=p1时,p是一个nil值,如上所述。所以它适用于我的示例,但不适用于多数字键。修好了。