【问题标题】:Lua - Find "tags" in string?Lua - 在字符串中查找“标签”?
【发布时间】:2014-08-10 15:33:24
【问题描述】:

我打算使用 Lua 模式,除非有更好的方法。

我希望能够解析一个字符串,并寻找“标签”。例如,我想找到字符串的 '[color=???][/color]' 部分,不关心等号之后的内容,不关心标签之间的内容,也不关心标签中的位置字符串,只要它们在字符串中的 somewhere 中,并且 'color=' 后面有一个十六进制值。这是一个示例字符串:

mystring = 'Hello, [color=#0026FF]world[/color]!'
--                 ^^^^^^^^^^^^^^^     ^^^^^^^^

【问题讨论】:

  • Parsing general-purpose markup languages that allow nesting is not possible using regular expressions. - 这看起来像是著名的论坛样式标记语言,我不记得它的名字了 - 有没有人为它编写过合适的解析器?
  • 我在phpBB上看到过,我觉得它叫phpBB Code Markup。不确定它是否有名字。我认为还没有人写过解析器。该死!我可以通过其他方式在 Lua 中查找这些标签吗?
  • 您的标记有多复杂?具体规则是什么?找到它们后你想做什么? Patterns in the manual
  • 请注意 Lua 模式不是正则表达式;它们有不同的语法,而且模式比正则表达式弱。
  • @paramagnetic:phpBB 是高度特殊的。我不会感到惊讶,论坛引擎中的实际解析器是您试图避免的大量正则表达式:)

标签: string lua lua-patterns


【解决方案1】:

Patterns in the manual

第一步,拆分token:

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]"
"!"

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

【讨论】:

  • 我收到一条错误消息,提示“格式错误(缺少']')”
  • 但是i是类型号
  • @Deduplicator,我使用的是 Lua 5.1 版
  • @hjpotter92:该死,没有测试的重构太多了。
  • 有效!我不断打印出“q”,所以我不确定 :format(v) 对代码做了什么...
猜你喜欢
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多