【发布时间】:2019-02-04 04:08:51
【问题描述】:
我的环境:
- Lua 5.1
- 绝对不能使用带有本机组件(如 C .so/.dll)的库
- 我可以运行任意纯 Lua 5.1 代码,但我无法访问
os和其他几个允许访问本机文件系统、shell 命令或类似内容的包,因此所有功能都必须在 Lua 中实现本身(仅)。 - 我已经成功加入LuLpeg。我可能可以引入其他纯 Lua 库。
我需要编写一个函数,如果输入字符串匹配任意字母和数字序列作为重复一次或多次的整个单词,并且可能在整个匹配子串的开始或结束。我使用“整个单词”的含义与 PCRE 单词边界 \b 相同。
为了演示这个想法,这里是使用 LuLpeg 的 re 模块的错误尝试;它似乎适用于负前瞻,但不适用于负前瞻背后:
function containsRepeatingWholeWord(input, word)
return re.match(input:gsub('[%a%p]+', ' %1 '), '%s*[^%s]^0{"' .. word .. '"}+[^%s]^0%s*') ~= nil
end
这里是示例字符串和预期的返回值(引号是语法上的,就像输入到 Lua 解释器中一样,而不是字符串的文字部分;这样做是为了使尾随/前导空格明显):
-
输入:
" one !tvtvtv! two",word:tv,返回值:true -
输入:
"I'd",word:d,返回值:false -
输入:
"tv",word:tv,返回值:true -
输入:
" tvtv! ",word:tv,返回值:true -
输入:
" epon ",word:nope,返回值:false -
输入:
" eponnope ",word:nope,返回值:false -
输入:
"atv",word:tv,返回值:false
如果我有一个完整的 PCRE 正则表达式库,我可以很快做到这一点,但我没有,因为我无法链接到 C,而且我还没有找到 PCRE 或类似的任何纯 Lua 实现。
我不确定 LPEG 是否足够灵活(直接使用 LPEG 或通过其 re 模块)来做我想做的事,但我很确定 Lua 的内置函数不能做我想做的事,因为它无法处理重复的字符序列。 (tv)+ 不适用于 Lua 的内置 string:match 函数和类似函数。
我一直在寻找有趣的资源,试图弄清楚如何做到这一点,但无济于事:
- http://www.inf.puc-rio.br/~roberto/lpeg/re.html
- http://www.lua.org/manual/5.2/manual.html#6.4.1
- http://lua-users.org/wiki/FrontierPattern(很遗憾我的解释器不支持)
- http://lua-users.org/wiki/PatternsTutorial
- http://www.gammon.com.au/lpeg
- http://lua-users.org/wiki/StringRecipes
- how to check if a word appears as a whole word in a string in Lua
【问题讨论】: