Lua gsub - How to set max character limit in regex pattern

倖福魔咒の 提交于 2019-12-31 03:23:20

问题


From strings that are similar to this string:

|cff00ccffkey:|r value

I need to remove |cff00ccff and |r to get:

key: value

The problem is that |cff00ccff is a color code. I know it always starts with |c but the next 8 characters could be anything. So I need a gsub pattern to get the next 8 characters (alpha-numeric only) after |c.

How can I do this in Lua? I have tried:

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

but that will remove everything up to the first white-space and I don't know how to specify the max characters to select to avoid this.

Thank you.


回答1:


Lua patterns do not support range/interval/limiting quantifiers.

You may repeat %w alphanumeric pattern eight times:

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

See the Lua demo online.

You may also make it a bit more dynamic if you build the pattern like ('%w'):.rep(8):

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

See another Lua demo.

If your strings always follow this pattern - |c<8alpnum_chars><text>|r<value> - you may also use a pattern like

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

See this Lua demo

Here, the pattern matches:

  • ^ - start of string
  • |c - a literal |c
  • " ..('%w'):rep(8) .. " - 8 alphanumeric chars
  • (.-) - Group 1: any 0+ chars, as few as possible
  • |r - a |r substring
  • (.*) - Group 2: the rest of the string.

The %1 and %2 refer to the values captured into corresponding groups.



来源:https://stackoverflow.com/questions/53362991/lua-gsub-how-to-set-max-character-limit-in-regex-pattern

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!