正则表达式作为 Lua 模式

标签 regex lua pattern-matching lua-patterns

我写了(?<=;)[^\^]*正则表达式,但我在将其转换为在 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/

相关文章:

bash 文件名开始匹配

sql - 删除编号重复超过 5 次的记录

pattern-matching - 使用来自定理的信息进行模式匹配

ruby - 正则表达式中的捕获组多于匹配的字符串?

regex - 从大文本文件中获取链接列表

c# - LuaInterface - 在 .Net 3.5/.Net 4.0 下编译 FileLoadException

javascript - PHP 中用于运行用户脚本的解释语言

PHP 仅将主机+IP 解析为 IP 地址

c# - 如何在C#中通过正则表达式匹配由给定子字符串构造的字符串

dictionary - lua 5.2 改变表格中元素的顺序