纯Lua功能齐全的正则表达式库

时间:2019-01-08 12:55:13

标签: regex lua

我正在编写一个Elder Scrolls Online插件,该插件由经过轻微修改的名为Havok Script的Lua 5.1引擎支持。这个Lua环境不允许访问osiopackagedebug模块或任何本机平台绑定,并且没有办法解决此限制,因为ESO是专有软件。

在这种受限的环境中,我需要具有环视功能(负向和正向超前和向后超前)的功能完整的正则表达式引擎。性能几乎无关紧要,但是便利性是头等大事(我没有时间或能力编写自己的正则表达式引擎)。

正则表达式引擎的实际语法比功能集重要。因此,PCRE,JS regex,Java regex或.NET regex引擎(上面的任何一个甚至略有不同)可能都很好。 POSIX太简单了,因为它不支持任何环顾行为。

正则表达式将是未经验证的用户输入,但是环境实际上是沙箱,因此用户无法对其进行任何恶意处理。由于输入是用户输入,因此我不能“仅”使用LPEG之类的东西。用户群绝对会拒绝学习像LPEG这样的全新概念,而不是相对熟悉的regex语法。

在寻找Lua regex引擎时,我用尽了很多选择:

  • 与本机平台的绑定,例如lregexp和其他libpcre Lua绑定。这些绝对不会,也永远不会在我的用例中起作用,因为环境无法访问本机平台,所以它们就退出了。
  • reLua,它支持基本的“常规”模式,例如交替和贪婪的闭包,但绝对没有环顾行为。我没有能力向该项目添加环顾四周,因此,除非存在添加了该叉子的叉子,否则我将无法使用它。
  • 使用castl将用纯JavaScript实现的完整正则表达式引擎(不使用JS的内置正则表达式功能)编译到Lua中。这在某种程度上很有希望,但是我在castl中命中了fatal flaw,显然也击中了tessel,因为Lua的人为限制了每个范围200的可变限制,而这些编译器没有任何方式解决该问题(他们要做的是将一个局部变量声明为一个表并将所有数据填充到该表中,然后将原始JS中的所有引用从局部变量访问更改为Lua中的表访问)。因为这是一个根本性的问题,所以我不确定这是否行得通,但也许最接近解决方案的方法是通过某种方式尝试解决此问题?
  • 我从JS之外的其他语言中寻找翻译器,但没有找到。基本上,我可以找到的唯一的“ X语言转换为纯Lua语言”编译器是castl和tessel。
  • 我也(绝望地)尝试将最新的emscriptened libpcre(对于未起步的C代码编译为JS)进行编译,然后使用castl将那个编译为Lua。运行代码时,这甚至会导致更奇怪的Lua错误,即Lua解释器无法找到被要求goto的标签,尽管该标签已明确存在于代码中。我只能认为这是因为生成的代码是如此之大,以至于Lua放弃了寻找它的尝试。

此刻我陷入僵局;我不知道如何继续获得所需的功能。是否有一个库可以为我还没有找到的Lua提供一个纯粹的Lua,功能齐全的正则表达式引擎?我放弃了Google的第七页或第八页。

2 个答案:

答案 0 :(得分:1)

根据您的确切要求,您可以尝试使用LPEG的re module。明显的优势是,基本上在Lua可用的任何地方都可以使用它。另一方面,您必须记住,这是regex的独立实现,因此与regex不兼容。 POSIX。但是,只要表达式足够简单,您就不会注意到。

答案 1 :(得分:0)

回答我自己的问题,最好的解决方案似乎是 HREHaxe。我选择它的原因包括:

  • Haxe 生成出色的 Lua 代码。
  • 将 Haxe 编译(或转译?)到 Lua 既简单又可靠,因为 Haxe 旨在支持此用例。
  • 正则表达式库 (HRE) 的质量非常高,支持正面和负面的前瞻和后视。
  • 熟悉的语法。