解析Lua字符串中的可选静态文本?
问题描述:
我有一个场景,我需要能够匹配字符串中文本的可选静态部分,但该静态部分可能是2种可能性中的1种。解析Lua字符串中的可选静态文本?
下面是一些可能的例子,我需要能够解析:
"foo + offset bar"
"*foo + bar"
"foo + bar"
"*foo + *bar"
"offset foo + offset bar"
其中任一"offset"
或"*"
应该在每个标识符的前可选的。 (在这种情况下“富”和“酒吧”)
是否有任何实际的方法来做到这一点使用Lua的字符串匹配?我想的是一样的东西:
"[offset]?%s*%*?%s*[_%a][_%w]*"
但"[offset]?"
只是一个可选的字符类,它们可以是o, f, s, e, or t;
即使它不是用户将能够发送类似输入:
"offset * foo + offset * bar"
没有得到一个适当的警告。
从伪代码的角度来看,我试图做可能会看起来像
("offset" or "*" or "") and "%s*[_%a][_%w]*"
概括起来,有没有什么办法来匹配文本的可选静态部分或部分使用Lua的字符串匹配系统的字符串?
感谢
答
您可以临时替换关键字 “偏移” 与一些未使用的符号(例如, “@”),然后分析结果:
local input_strings = {
"foo + offset bar" ,
"*foo + bar" ,
"foo + bar" ,
"*foo + *bar" ,
"offset foo + offset bar",
"offset1 + offset2"
}
for _, s in ipairs(input_strings) do
print("Expression: "..s)
s = s:gsub("%f[%w_]offset%f[^%w_]", "@") -- convert keyword to "@"
for prefix, identifier in s:gmatch"([%@%*]?)%s*([_%a][_%w]*)" do
prefix = prefix == "@" and "offset" or prefix -- convert "@" to keyword
print("Prefix: "..prefix)
print("Identifier: "..identifier)
end
print()
end
输出:
Expression: foo + offset bar
Prefix:
Identifier: foo
Prefix: offset
Identifier: bar
Expression: *foo + bar
Prefix: *
Identifier: foo
Prefix:
Identifier: bar
Expression: foo + bar
Prefix:
Identifier: foo
Prefix:
Identifier: bar
Expression: *foo + *bar
Prefix: *
Identifier: foo
Prefix: *
Identifier: bar
Expression: offset foo + offset bar
Prefix: offset
Identifier: foo
Prefix: offset
Identifier: bar
Expression: offset1 + offset2
Prefix:
Identifier: offset1
Prefix:
Identifier: offset2
我不知道有可能匹配可选的特定单词,就像你可以用单个字符一样。我想你必须做几场比赛并把它们结合起来。 – Piglet