Lua模式下的正则表达式

我写了(?<=;)[^\^]*的正则表达式,但我在将其转换以在Lua中使用时遇到了问题。我想将

^#57df44; Cobblestone ^ white; 

变成

Cobblestone

但如果字符串不包含任何颜色代码,则应按原样返回。

有人可以帮帮我吗?

点赞
用户3832970
用户3832970

使用捕获组:

local s = "^#57df44;Cobblestone^white;"
res = s:match(";([^^]*)") or s
print( res )
-- Cobblestone

请参考Lua demo

在此示例中,

  • ; - 匹配第一个 ;
  • ([^^]*) - 捕获组 1 匹配除了 ^ 之外的任意 0 个或多个字符,并存储在组1中

如果模式中定义了捕获组,则 string.match 仅返回捕获的部分。

更多细节

如评论中所述,您可以在当前场景中使用 frontier pattern %f[^:] 代替 (?<=:)

前沿模式 %f 后跟一个集合可以检测从“非集合”到“集合”的过渡。

但是,前沿模式并不是正后发 (?<=:) 的良好替代品,因为后者可以处理 序列 的模式,而前沿模式仅适用于单个原子。因此,%f[^:] 表示“在字符串中处于 : 和非 : 之间的位置”。但是,一旦您需要在 city= 后匹配除了 ^ 之外的任何 0 个或多个字符,则前沿模式将是一个错误的结构。因此,与具有捕获组的 string.match 相比,它不易扩展。

2017-08-29 14:08:16