正则表达式无处不在,但在Lua

时间:2017-10-08 07:21:15

标签: regex lua

我的正则表达式无法在Lua中工作。我已经在其他环境中测试了它,比如我的文本编辑器和一些在线正则表达式工具,它似乎在那里工作得很好。

正则表达式在我的其他环境中的运行方式:

RAY\.decrypt\s*\(([\"\'].+?(?=[\"\']).+?(?=[\)]))\s*\)

正在尝试在Lua中使用的正则表达式(仅用%&替换为

RAY%.decrypt%s*%(([\"\'].+?(?=[\"\']).+?(?=[%)]))%s*%)

我试图匹配的示例文本(我想捕获括号中的内容)

RAY.decrypt ("\x02\x02\x02\x02\x02\x02\x02\x02")
RAY.decrypt ("\xd6E\xd6E\xd6E\xd6E\xd6E")
RAY.decrypt("\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e")

其他工具与文本匹配,并完美捕捉我想要捕获的内容。但是我努力让Lua做到这一点,因为它不匹配任何东西。

local s = [[RAY.decrypt ("\x02\x02\x02\x02\x02\x02\x02\x02")
RAY.decrypt ("\xd6E\xd6E\xd6E\xd6E\xd6E")
RAY.decrypt("\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e")]]

print(string.find(s, "RAY%.decrypt%s*%(([\"\'].+?(?=[\"\']).+?(?=[%)]))%s*%)"))
> nil

任何帮助将不胜感激,谢谢!

4 个答案:

答案 0 :(得分:1)

local s = [[
RAY.decrypt ("\x02\x02\x02\x02\x02\x02\x02\x02")
RAY.decrypt ('\xd6E\xd6E\xd6E\xd6E\xd6E')
RAY.decrypt( "\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e" )
]]

for w in s:gmatch"RAY%.decrypt%s*%(%s*(([\"']).-%2)%s*%)" do
   print(w)
end

输出:

"\x02\x02\x02\x02\x02\x02\x02\x02"
'\xd6E\xd6E\xd6E\xd6E\xd6E'
"\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e"

答案 1 :(得分:0)

我根本不认识LUA,但维基百科说LUA正则表达式引擎: "使用简化的,有限的方言;可以绑定到更强大的库,如PCRE或替代解析器,如LPeg。"

所以你应该将它绑定到PCRE,或者你不应该与其他引擎进行比较,只需使用LUA文档专门为LUA编写正则表达式,而不是文本编辑器。

答案 2 :(得分:0)

Lua的标准字符串库不支持完整的正则表达式,但它的模式匹配非常强大。

此脚本匹配括号内的所有内容:

for w in s:gmatch("%((.-)%)") do
   print(w)
end

答案 3 :(得分:0)

Lua内置"正则表达式"被称为"模式"

这匹配括号中的内容

local source = [[
  RAY.decrypt ("\x02\x02\x02\x02\x02\x02\x02\x02")
  RAY.decrypt ("\xd6E\xd6E\xd6E\xd6E\xd6E")
  RAY.decrypt("\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e")
]]

-- this captures expressions containing RAY.decrypt ( " ... " )
for content in string.gmatch(source , "RAY%.decrypt%s*%(%s*\"(.-)\"%s*%)") do
   print(content)
end

-- this captures expressions inside double quotes
for content in string.gmatch(source , "\"(.-)\"") do
   print(content)
end

-- this captures expressions inside single or double quotes e.g. RAY.decrypt  ( '\x8e\x8e\x8e\x8e\x8e\x8e\x8e\x8e')
for content in string.gmatch(source , "[\"'](.-)[\"']") do
   print(content)
end

-- this captures expressions inside parentheses (will capture the quotes)
for content in string.gmatch(source , "%((.-)%)") do
   print(content)
end