我写了(?<=;)[^\^]*
正则表达式,但我在将其转换为在 Lua 中使用时遇到问题。我要转型
^#57df44;Cobblestone^white;
进入
Cobblestone
但如果字符串不包含任何颜色代码,则应“按原样”返回。
有人可以帮我解决这个问题吗?
最佳答案
使用捕获组:
local s = "^#57df44;Cobblestone^white;"
res = s:match(";([^^]*)") or s
print( res )
-- Cobblestone
请参阅Lua demo .
这里,
-
;
- 匹配第一个;
-
([^^]*)
- 捕获组 1 匹配除^
之外的任何 0+ 个字符进入第 1 组
string.match
如果模式中定义了捕获组,则仅返回捕获的部分。
更多详情
正如评论中提到的,您可以使用 frontier pattern %f[^:]
而不是(?<=:)
在目前的情况下。
The frontier pattern %f followed by a set detects the transition from "not in set" to "in set".
但是,前沿模式并不能很好地替代正向回顾 (?<=:)
因为后者可以处理模式的序列,而前沿模式仅适用于单个原子。所以,%f[^:]
表示 放在 :
之间的字符串中和非 :
。但是,一旦您需要匹配 ^
之外的任何 0+ 个字符之后city=
,边界模式将是一个错误的使用结构。因此,它不像string.match
那么容易扩展。带有捕获组。
关于正则表达式作为 Lua 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941230/