Lua gsub - 如何在正则表达式模式中设置最大字符限制

从类似于以下字符串的字符串中:

|cff00ccffkey:|r value

我需要删除 |cff00ccff 和 |r,以便得到:

key: value

问题是 |cff00ccff 是一个颜色代码。我知道它总是以 |c 开始,但是下一个 8 个字符 可以是任何字符。因此,我需要一个 gsub 模式来获取 |c 后的下一个 8 个字符(只包括字母或数字)。

我该如何在 Lua 中实现这一点?我尝试过:

local newString = string.gsub("|cff00ccffkey:|r value", "|c%w*", "")
newString = string.gsub(newString, "|r", "")

但是它将删除所有的内容直到第一个空格,我不知道如何指定最大字符以避免这种情况。

谢谢。

点赞
用户3832970
用户3832970

Lua 正则表达式不支持范围/区间/限制量词。

您可以重复使用 %w 字母数字模式八次:

local newString = string.gsub("|cff00ccffkey:|r value", "|c%w%w%w%w%w%w%w%w", "")
newString = string.gsub(newString, "|r", "")
print(newString)
-- => key: value

详见 Lua demo online

如果您按照 |c<8alpnum_chars><text>|r<value> 模式排列字符串,您还可以构造如下正则表达式:

local newString = string.gsub("|cff00ccffkey:|r value", "^|c" ..('%w'):rep(8) .. "(.-)|r(.*)", "%1%2")

详见 this Lua demo

其中,该模式匹配:

  • ^ - 字符串起始位置
  • |c - 字面 |c
  • " ..('%w'):rep(8) .. " - 8 个字母数字字符
  • (.-) - 第 1 捕获组:0 个或多个字符
  • |r - 一个 |r 子字符串
  • (.*) - 第 2 捕获组:其余的字符串。

%1%2 引用了相应组中捕获的值。

2018-11-18 16:26:02