如何用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 printOtherMatchesstr-- 获取开和闭标签
    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中创建一种字符串模式。这是我尝试仿效该种模式序列的尝试。如果有人有任何想法或关于如何实现这一点的见解,我将非常感激!

点赞
用户6834680
用户6834680
-- 允许对括号进行简单的自定义控制
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)
2017-01-20 12:09:44
用户3735873
用户3735873

以下是一种可能的方案:

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 环境中运行才能正常执行。

2017-01-20 13:16:52