我正在编写一个Elder Scrolls Online插件,它由一个轻微修改的Lua 5.1引擎Havok Script支持。这个Lua环境不允许访问
在这个受限环境中,我需要一个功能完备的正则表达式引擎,具有前后查找功能(负向和正向预查和回顾)。性能几乎无关紧要,但方便性是最重要的考虑因素(我没有时间或能力编写自己的正则表达式引擎)。
实际的正则表达式引擎语法不如特性集合重要。因此,PCRE、JS正则表达式、Java正则表达式或.NET正则表达式引擎,以上任何一种甚至略有不同的东西都可能很好。POSIX太简单了,因为它不支持任何前后查找行为。
正则表达式将是未经验证的用户输入,但环境实际上是一个沙盒,因此用户无法对其进行恶意操作。由于输入是用户输入,我不能“只是”使用像LPEG这样的东西;用户群体绝对会反对必须学习一个全新的概念,如LPEG,而不是相对熟悉的正则表达式语法。
在寻找Lua正则表达式引擎时,我已经耗尽了许多选项:
os
、io
、package
、debug
模块或任何本地平台绑定,并且没有办法规避这个限制,因为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、完整功能的正则表达式引擎,我只是还没有找到?我在谷歌的第七或第八页就放弃了。
re
模块是否满足您的需求? - Henri Menkere
模块非常好用。上游的LPEG不起作用,因为它是本地代码。感谢指点 - 我以为LPEG只是一个独立的东西,我不知道它有一个相对容易使用的正则表达式引擎,与PCRE相似。谢谢 - 你能把它发表为答案吗? - allquixoticcastl
对我的需求不适用,因为它生成的是 Lua 5.2 代码而不是 Lua 5.1 代码。我想用 if/then/else 重写大量无条件跳转可能会很困难。 - allquixoticre
模块,这就是我最终使用的,所以它略微不太有用。还是感谢您的帮助。 - allquixotic