LUA中string.format中的正则表达式

我使用LUA中的string.format(str, regex)来获取一些关键字。

local RICH_TAGS = {
    "texture",
    "img",
}
--\[((img)|(texture))=
local START_OF_PATTER = "\\[("
for index = 1, #RICH_TAGS - 1 do
    START_OF_PATTER = START_OF_PATTER .. "(" .. RICH_TAGS[index]..")|"
end
START_OF_PATTER = START_OF_PATTER .. "("..RICH_TAGS[#RICH_TAGS].."))"

function RichTextDecoder.decodeRich(str)
    local result = {}
    print(str, START_OF_PATTER)
    dump({string.find(str, START_OF_PATTER)})
end

输出

hello[img=123]  \[((texture)|(img))
dump from: [string "utils/RichTextDecoder.lua"]:21: in function 'decodeRich'
"<var>" = {
}

输出意味着:

str = hello[img=123]

START_OF_PATTER = \[((texture)|(img))

这个正则表达式在一些在线正则表达式工具中运行良好,但在LUA中却无法找到任何匹配项。我的代码有什么误用吗?

点赞
用户2858170
用户2858170

你不能在 Lua 中使用正则表达式。使用 Lua 的 字符串模式 来匹配字符串。

参考 如何在 Lua 中编写正则表达式?

尝试 dump({str:find("\\%[%("))})

还要注意这个循环:

for index = 1, #RICH_TAGS - 1 do
    START_OF_PATTER = START_OF_PATTER .. "(" .. RICH_TAGS[index]..")|"
end

会漏掉 RICH_TAGS 的最后一个元素,我想这不是你的意图。

编辑:

但是我想要获取几个特定的单词。例如,该模式可以获取 "[img=" "[texture=" "[font=" 中的任何一个。使用我在问题中编写的正则表达式字符串,正则表达式可以完成这项工作。但是使用 Lua,完成此工作的方法是编写像 string.find(str,"[img=") 和 string.find(str,"[texture=") 和 string.find(str,"[font=") 这样的代码。我想知道有没有一种方法可以使用单个模式字符串完成这项工作。我尝试了模式字符串如 "%[%a*=",但很明显它将获取更多我需要的字符串。

除非这些单词以特定的顺序出现在字符串中,否则无法使用单个模式匹配几个特定单词。您唯一能做的就是将构成这些单词的所有字符放入类中,但是这样做会有风险,因为您可能会找到您可以从这些字母中构建的任何单词。

通常,您会使用单独的模式匹配每个单词,或者您会匹配任何单词,并检查匹配是否是您的单词之一,例如使用查找表。

因此,您基本上可以用几行 Lua 完成正则表达式库会执行的操作。

2021-04-08 05:27:37