Lua - 在字符串中查找“标记”?

4
我计划使用Lua模式,除非有更好的方法来完成这个任务。
我想要能够解析一个字符串,并查找“标记”。例如,我想找到一个字符串中的 '[color=???][/color]' 部分,不关心等号后面是什么,不管标记之间的内容是什么,也不在意他们在字符串中的位置,只要它们出现在字符串中的 任何地方,并且'color='后面有十六进制值。以下是一个样例字符串:
mystring = 'Hello, [color=#0026FF]world[/color]!'
--                 ^^^^^^^^^^^^^^^     ^^^^^^^^

1
使用正则表达式无法解析允许嵌套的通用标记语言。这看起来像那个著名的论坛样式标记语言,我不记得它的名字了 - 有人已经为它编写了一个适当的解析器吗? - The Paramagnetic Croissant
我在phpBB上看到过它,我认为它被称为phpBB代码标记。不确定它是否有名称。我不认为有人已经编写了解析器。真糟糕!我还有其他方法可以在Lua中查找这些标记吗? - Eamonn
你的标记有多复杂?确切的规则是什么?当你找到它们时,你想做什么?手册中的模式 - Deduplicator
2
请注意,Lua模式不是正则表达式;它们有不同的语法,并且模式比正则表达式更弱。 - Colonel Thirty Two
@paramagnetic:phpBB非常特殊。如果论坛引擎中的实际解析器是您试图避免的一大堆正则表达式混乱,我不会感到惊讶 :) - hugomg
显示剩余2条评论
1个回答

4

手册中的模式

第一步,拆分令牌:

function split_tag(s, i)
  i = (i or 0) + 1
  local j = s:sub(i, i)
  if j == "" then
    return
  end
  j = s:find(j == "[" and "]" or ".%f[[\0]", i) or #s
  -- In Pre-5.2 Lua use %z instead of \0 in the pattern
  return j + 1, s:sub(i, j)
end
for k, v in split_tags, 'Hello, [color=#0026FF][bold]world[/bold][/color]!' do
  print(('%q\n'):format(v))
end

因此,您获得了输入字符串。
'Hello, [color=#0026FF][bold]world[/bold][/color]!'

分割成
"Hello, "
"[color=#0026FF]"
"[bold]"
"world"
"[/bold]"
"[/color]"
"!"

标准的括号匹配算法留给读者作为练习。


我收到一个错误,说“格式不正确的模式(缺少']')”。 - Eamonn
但是 i 是数字类型。 - hjpotter92
@Deduplicator,我正在使用Lua 5.1版本。 - Eamonn
@hjpotter92:该死,重构太多了,没有测试。 - Deduplicator
它有效!我不断地得到“q”被打印出来,所以我不确定:format(v)对代码做了什么... - Eamonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接