解析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的字符串匹配系统的字符串?

感谢

+0

我不知道有可能匹配可选的特定单词,就像你可以用单个字符一样。我想你必须做几场比赛并把它们结合起来。 – Piglet

您可以临时替换关键字 “偏移” 与一些未使用的符号(例如, “@”),然后分析结果:

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