Lua: gmatch, last occurence - greedy quantificator is extemely slow

Lua 5.2 (不是JIT)。(我知道我的正则表达式可能效率不高,如果您有更好的,请告诉我)

我正在尝试查找文件中最后出现的字符串。它看起来像这样:

2018-05-02 11-05-06|(一些文本)And code phrase is "code/xx-nn."

我读取了整个文件,然后使用以下代码:

local y, m, d, H, M, S, code = content:gmatch('.*\n(%d+)-(%d+)-(%d+) (%d+)-(%d+)-(%d+)|[^\n]+And code phrase is "code[/\\]([%a-]+)%."')()

如果文件中存在这个字符串,Lua会很快地找到它,但如果没有,它最多需要一秒钟来遍历文本并返回nil

我想知道为什么。贪婪量词如此之慢吗?或者我的正则表达式有误?

我尝试在内容上使用string.reverse(),然后只需进行反向正则表达式:

local code, S, M, H, d, m, y = content:gmatch('"%.([%a-]+)[/\\]edoc" si esarhp edoc dnA[^\n]+|(%d+)-(%d+)-(%d+) (%d+)-(%d+)-(%d+)')()

即使文件中没有我需要的字符串,它也可以快速工作。

点赞