我有一个场景,我需要能够匹配字符串中文本的可选静态部分,但该静态部分可能是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的字符串匹配系统匹配字符串中的可选静态部分或文本部分?
由于
答案 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