Lua: 在一个分隔字符串中查找一个标记

我有一个包含一组分隔令牌的字符串,看起来像这样:

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。我也想使用原始的 Lua,不使用任何插件或扩展。我也希望它能够合理地高效执行。到目前为止,我想到的唯一正确实现的方法是将字符串拆分成表,然后进行迭代,这显然非常低效。

点赞
用户1190388
用户1190388

这里是代码的示例: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" )
2012-07-15 19:14:20
用户50476
用户50476

由于 Lua 的模式匹配 API 中没有 |(逻辑或)运算符,因此您可以像这样做:

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
2012-07-15 19:16:37