这个问题不会问Lua模式是否是PCRE。这已被多次询问,答案绝对没有。
相反,我问的是,Lua模式是否与正式语言定义类似于常规语言。我的直觉不是因为我无法为这种常规语言创建模式:
L = {'foo'}* = {'', 'foo', 'foofoo', 'foofoofoo', ...}
我所有的尝试都失败了,因为Lua似乎缺乏在捕获时使用Kleene Star的能力:
> print(('foofoo'):find('(foo)*'))
nil
你能否证明Lua中没有可以表示L
的模式,更一般地说,是否可以为任何常规语言创建Lua模式?
答案 0 :(得分:1)
Lua模式不是常规语言。几乎每个Lua模式都可以表示为常规语言,但是有很多正则表达式不能表示为Lua模式(并且至少有一个Lua模式不是常规的)。并且Lua模式无法实现您尝试执行的特定常规构造,匹配特定字符序列的重复。不是一般情况。
基本上,Lua模式不能做任何需要基于输入流中多个字符的决策点的事情。常规语言可以。
答案 1 :(得分:-1)
Kleene Star可轻松实施:
function belongs_to_L(str)
return str:gsub("foo", "") == ""
end
print(belongs_to_L("foofoo")) --> true
print(belongs_to_L("bar")) --> false