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

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

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

"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或t;而且即使不是用户也会能够发送像这样的输入:

"offset * foo + offset * bar"

而没有得到正确的警告。

从伪代码的角度来看,我正在尝试做的事情可能看起来像

"offset""*""")和"%s*[_%a][_%w]*"

总之,是否有办法使用Lua的字符串匹配系统匹配字符串中的可选静态部分或部分?

谢谢

点赞
用户6834680
用户6834680

你可以暂时用未使用的符号(例如“@”)替换关键字“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("表达式:"..s)
   s = s:gsub("%f[%w_]offset%f[^%w_]", "@")         -- 将关键字转换为“@”
   for prefix, identifier in s:gmatch"([%@%*]?)%s*([_%a][_%w]*)" do
      prefix = prefix == "@" and "offset" or prefix -- 将“@”转换为关键字
      print("前缀:"..prefix)
      print("标识符:"..identifier)
   end
   print()
end

输出:

表达式:foo + offset bar
前缀:
标识符:foo
前缀:offset
标识符:bar

表达式:*foo + bar
前缀:*
标识符:foo
前缀:
标识符:bar

表达式:foo + bar
前缀:
标识符:foo
前缀:
标识符:bar

表达式:*foo + *bar
前缀:*
标识符:foo
前缀:*
标识符:bar

表达式:offset foo + offset bar
前缀:offset
标识符:foo
前缀:offset
标识符:bar

表达式:offset1 + offset2
前缀:
标识符:offset1
前缀:
标识符:offset2
2017-08-09 11:15:45