纯Lua实现的完整正则表达式库

4
我正在编写一个Elder Scrolls Online插件,它由一个轻微修改的Lua 5.1引擎Havok Script支持。这个Lua环境不允许访问osiopackagedebug模块或任何本地平台绑定,并且没有办法规避这个限制,因为ESO是专有软件。
在这个受限环境中,我需要一个功能完备的正则表达式引擎,具有前后查找功能(负向和正向预查和回顾)。性能几乎无关紧要,但方便性是最重要的考虑因素(我没有时间或能力编写自己的正则表达式引擎)。
实际的正则表达式引擎语法不如特性集合重要。因此,PCRE、JS正则表达式、Java正则表达式或.NET正则表达式引擎,以上任何一种甚至略有不同的东西都可能很好。POSIX太简单了,因为它不支持任何前后查找行为。
正则表达式将是未经验证的用户输入,但环境实际上是一个沙盒,因此用户无法对其进行恶意操作。由于输入是用户输入,我不能“只是”使用像LPEG这样的东西;用户群体绝对会反对必须学习一个全新的概念,如LPEG,而不是相对熟悉的正则表达式语法。
在寻找Lua正则表达式引擎时,我已经耗尽了许多选项:
  • 与本地平台的绑定,例如lregexp和其他libpcre Lua绑定。这些无法用于我的用例,因为环境无法访问本地平台,所以它们被排除在外。
  • reLua,支持基本的“常规”模式,如交替和贪婪闭包,但绝对没有前后查找行为。我没有能力在此项目中添加前后查找,所以除非存在具有该功能的分支,否则我无法使用它。
  • 将完整的正则表达式引擎(不使用JS内置的正则表达式函数)转换为Lua,使用castl纯JavaScript实现。这有些有希望,但我在castl中遇到了致命缺陷,显然也在tessel中遇到了,因为Lua在每个作用域中的变量限制人为设定为200,这些转换器没有任何办法解决这个问题(他们必须将一个局部变量声明为表,并将所有数据塞入该表中,然后将原始JS中的所有引用从局部变量访问更改为Lua中的表访问)。因为这是一个如此根本性的问题,我不确定这是否可行,但也许最接近解决方案的方法是通过某种方式解决这个问题?
  • 我寻找了其他语言的转换器,但找不到。基本上我能找到的唯一的“X语言到纯Lua”编译器是castl和tessel。
  • 我还(出于绝望)尝试将最新的{{link4:emscriptened libpcre}}(对于未经训练的人:编译为JS的C代码),然后使用castl将其转换为Lua。这在运行代码时会导致更奇怪的Lua错误,其中Lua解释器无法找到被要求goto的标签,尽管该标签在代码中明确存在。我只能想到这是因为生成的代码非常庞大,以至于Lua放弃尝试查找它。

目前我遇到了瓶颈;我不知道如何继续实现我想要的功能。是否有一个库可以为Lua提供纯Lua、完整功能的正则表达式引擎,我只是还没有找到?我在谷歌的第七或第八页就放弃了。


2
Lua解释器无法找到被要求跳转的标签。Lua 5.1在其语法中没有goto和标签。这是Lua 5.2的一个特性。 - Egor Skriptunoff
1
LPEG中的re模块是否满足您的需求? - Henri Menke
LuLpeg(纯Lua LPEG)的re模块非常好用。上游的LPEG不起作用,因为它是本地代码。感谢指点 - 我以为LPEG只是一个独立的东西,我不知道它有一个相对容易使用的正则表达式引擎,与PCRE相似。谢谢 - 你能把它发表为答案吗? - allquixotic
@EgorSkriptunoff 谢谢 - 我认为 castl 对我的需求不适用,因为它生成的是 Lua 5.2 代码而不是 Lua 5.1 代码。我想用 if/then/else 重写大量无条件跳转可能会很困难。 - allquixotic
1
@ShaH 谢谢您的评论,但是之前的评论者已经提供了答案——请参见Henri Menke的评论。他甚至更进一步地提到了我不知道的东西,这对我帮助很大:有一个LPEG模块接受非常熟悉的正则表达式语法,并使用底层的LPEG引擎来执行它。您的评论没有提到LPEG的re模块,这就是我最终使用的,所以它略微不太有用。还是感谢您的帮助。 - allquixotic
显示剩余2条评论
2个回答

3
根据您的具体要求,您可以尝试使用 LPEG 的 re 模块。明显的优点是它基本上可以在 Lua 可用的任何地方使用。另一方面,您必须记住,这是一个独立的正则表达式实现,因此与 POSIX 不兼容。然而,只要表达式足够简单,您就不会注意到这一点。

2
回答我自己的问题,最好的解决方案似乎是使用 HREHaxe。我选择这个方案的原因包括:
  • Haxe 生成出色的 Lua 代码。
  • 将 Haxe 编译(或转译?)为 Lua 很容易且可靠,因为 Haxe 设计用于支持此用例。
  • 正则表达式库(HRE)非常高质量,并支持正向和反向预查。
  • 熟悉的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接