如何在 Lua 中忽略字符串中的嵌套括号?

我有一组特殊字符,可以视为括号。当用户在这些括号之间包含文本时,我只想让程序将使用的任何括号替换为<,>。因此,如果*,*是括号,字符串是"Hello *world*",则程序应返回"Hello <world>"

问题是我想要避免嵌套出现这些括号对,并且我只想让程序关注最外层的一对。换句话说,一旦打开括号,就将所有字符视为普通字符,直到关闭打开的括号。

例如,如果我的括号是*,*#,#,并且我的字符串是"Hello *wo#rl#d*",则程序应返回:"Hello <wo#rl#d>"而不是:"Hello <wo<rl>d>"

我尝试使用string.gsub查找在定义的特殊字符之间的所有文本模式,但当然,它不会忽略它们的嵌套出现。

local specialChars = {"*", "#", "-"}
local text = "Hello, world. *Won#der#ful* day, -don't- you #th*in*k?#"

for i = 1,#specialChars do
    local bracket = specialChars [i]
    local escBracket =%bracket

    text = string.gsub(text,escBracket .. "(.-)" .. escBracket,functioncontentreturn“<”.. content ..“>”
    endend

printtext

上面的代码应该显示:

"Hello, world. <Won#der#ful> day, <don't> you <th*in*k?>"

但实际上显示为:

"Hello, world. <Won<der>ful> day, <don't> you <th<in>k?>"

任何帮助将不胜感激。

点赞
用户6834680
用户6834680
local text = "[[**Hello**, &_world_&.]] &_*Won#der#ful* day_&, **-don't- you** #th*in*k?#"
print(text)

local single_char = "*#-"
-- "o."=open, ".c"=close, "oc"=both open and close
local multi_char = { -- use chars "\1","\2",...,"\6" to start each group
   ["\1o."] = "[[",
   ["\1.c"] = "]]",
   ["\2o."] = "&_",
   ["\2.c"] = "_&",
   ["\3oc"] = "**",
}
for k, v in pairs(multi_char) do
   text = text:gsub(v:gsub("%p", "%%%0"), k)
end
text = text
   :gsub("["..single_char:gsub("%p", "%%%0").."]", "%0oc") -- 把单个特殊字符标记为既是开头又是结尾的
   :gsub("([\1-\6"..single_char:gsub("%p", "%%%0").."])o.(.-)%1.c", "<%2>") -- 匹配模式,并用 < > 括住 "<%2>" 中的内容
   :gsub("(["..single_char:gsub("%p", "%%%0").."])..", "%1") -- 把多余的字符去掉
   :gsub("[\1-\6]..", multi_char) -- 把被标记的多字符表示替换回来
print(text)

输出:

[[**Hello**, &_world_&.]] &_*Won#der#ful* day_&, **-don't- you** #th*in*k?#
<**Hello**, &_world_&.> <*Won#der#ful* day>, <-don't- you> <th*in*k?>
2019-08-12 12:28:21