我有一个带有一组分隔标记的字符串,如下所示:
local str = "foo;bar;baz"
我希望能够准确地判断给定的令牌是否在此字符串中:
in_str("foo", str) -- true
in_str("bar", str) -- true
in_str("baz", str) -- true
in_str("ba", str) -- false
in_str("foo;", str) -- false
使用PHP和正则表达式,我可以通过以下方式实现所需的效果:
function in_str($needle, $haystack) {
return (bool)preg_match('/(^|;)' . preg_quote($needle, '/') . '(;|$)/', $haystack);
}
但是,我不确定如何将这种逻辑翻译成Lua。我也宁愿能够在vanilla Lua中做到这一点,没有任何插件/扩展/等等。我也希望它合理有效。到目前为止,我设法正确实现这一点的唯一方法是将字符串拆分成表,然后迭代它,这显然效率非常低。
答案 0 :(得分:4)
以下是工作中的代码示例:LINK
local str = "foo;bar;baz;and;some;more;random;data;in;here"
function check(sString, sData)
print( string.find(";"..sString..";", ";"..sData..";") )
end
check( str, "foo" )
check( str, "bar" )
check( str, "ba" )
check( str, "baz" )
check( str, "random" )
check( str, "stuff" )
答案 1 :(得分:1)
由于Lua的模式匹配API中没有|
(逻辑OR)运算符,您可以这样做:
function in_str(needle, haystack)
return (haystack:find(';' .. needle .. ';') or
haystack:find('^' .. needle .. ';') or
haystack:find(';' .. needle .. '$')) ~= nil
end
local str = "foo;bar;baz"
print(in_str("foo", str)) -- true
print(in_str("bar", str)) -- true
print(in_str("baz", str)) -- true
print(in_str("ba", str)) -- false
print(in_str("foo;", str)) -- false