如何用Lua创建一个字符串模式来查找类似于markdown的封装文本?
我仍在逐渐适应字符串模式的概念,并遇到了与它们有关的问题。我正在尝试创建一个简单的程序,用于搜索一串文本,以查找任何括在任何括号中的特定字符。这是一个例子:
local str = "Hello <<world>>, my <<name>> is <<John>>"
-- 匹配 << ... >> 模式
for noun in str:gmatch("<<.->>") do
print(noun)
end
该程序将搜索字符串,匹配以<<开头,以>>结尾,以及两者之间的所有内容。这很好,这就是我想要的。但是,假设我想要一个不同的模式,仅获得这些标签之一中的文本,而不是两个标签(<和>而不是<<和>>)。这就是我遇到问题的地方:
-- 允许轻松自定义括号控制
local matchNouns = {"<<",">>"}
local matchOther = {"<",""}
local str = "<Hello> <<world>>, <my> <<name>> <is> <<John>>"
local function printOtherMatches(str)
-- 获取开和闭标签
local open, close = unpack(matchOther)
-- 将开和闭标签与查找其间的所有字符的模式拼接起来
for other in str:gmatch(open .. ".-" .. close) do
print(other)
end
end
printOtherMatches(str)
上述程序确实会打印<和>之间的所有内容(matchOther元素),但它也打印了用<<和>>捕获的文本。我只想让迭代器返回_明确_匹配开和闭标签的模式。因此,以上输出应该输出:
<Hello>
<my>
<is>
而不是:
<Hello>
<<world>>
<my>
<<name>>
<is>
<<John>>
基本上,就像使用*和**进行不同格式的markdown一样,我想在Lua中创建一种字符串模式。这是我尝试仿效该种模式序列的尝试。如果有人有任何想法或关于如何实现这一点的见解,我将非常感激!
以下是一种可能的方案:
local s = '<Hello> <<world>>, <my> <<name>> <is> <<John>>'
for s in s:gmatch '%b<>' do
if not s:sub(2,-2):match '%b<>' then print(s) end
end
这段代码用于筛选出 s 中所有不包含其他 <...> 语句的 <...> 语句并输出。
具体来说,首先定义了一个字符串 s,其中包含了多个嵌套的 <...> 语句。接着使用 s:gmatch '%b<>' 遍历 s 中所有的 <...> 语句,并将其分别赋值给 s。然后判断 s 去掉首末字符后的子字符串是否也包含了 <...>,如果不包含,则输出 s。这样就过滤掉了所有嵌套的 <...> 语句,只输出了符合条件的 <...> 语句。
注意,这段代码使用了 Lua 语言的特殊语法和函数,需要在 Lua 环境中运行才能正常执行。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

-- 允许对括号进行简单的自定义控制 local matchNouns = {"<<", ">>"} local matchOther = {"<", ">"} local delimiter_symbols = "<>" -- 从上述所有可能的分隔符中收集所有符号 local function printMatches(str, match_open_close) -- 获取开放和关闭括号 local open, close = unpack(match_open_close) -- 用模式串连接开放和关闭括号,以查找它们之间的所有字符 for other in str:gmatch( "%f["..delimiter_symbols:gsub("%p", "%%%0").."]" ..open:gsub("%p", "%%%0") .."%f[^"..delimiter_symbols:gsub("%p", "%%%0").."]" .."(.-)" .."%f["..delimiter_symbols:gsub("%p", "%%%0").."]" ..close:gsub("%p", "%%%0") .."%f[^"..delimiter_symbols:gsub("%p", "%%%0").."]" ) do print(other) end end local str = "<你好> <<世界>>, <我的> <<姓名>> <是> <<John>>" printMatches(str, matchOther)