arrays - 用于查找和替换文本的 Lua 字符串库选择

标签 arrays string lua string-matching

我是 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/

相关文章:

java - 转置二维数组仅适用于矩形数组 - Java

c# - 增量创建字符串的所有排列 C#

c - 如何在c编程中将用户输入与一个while循环的字符串进行比较

networking - luasocket 的 settimeout() 是如何工作的?

javascript - 如何从对象数组中获取特定数据并将其存储在js(vue js)中的新数组中

sql - Postgres - 将行数据作为 JSON 数组或数组返回

arrays - Excel:使用 vlookup 但在数组中使用通配符

c++ - 有什么方法可以消除此图形程序中的错误 "deprecated conversion from string"?

c++ - 如何检查 SWIG 接口(interface)文件中的 Lua 版本?

lua 字符串索引表并解包