在Lua字符串中解析可选的静态文本?

时间:2017-08-08 19:34:09

标签: string lua

我有一个场景,我需要能够匹配字符串中文本的可选静态部分,但该静态部分可能是2种可能性中的一种。

以下是我需要解析的一些可能性示例:

"foo + offset bar"

"*foo + bar"

"foo + bar"

"*foo + *bar"

"offset foo + offset bar"

其中"offset""*"在每个标识符前面应该是可选的。 (在这种情况下" foo"和" bar")

使用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的字符串匹配系统匹配字符串中的可选静态部分或文本部分?

由于

1 个答案:

答案 0 :(得分:1)

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

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