Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Lua:在分隔字符串中查找标记_String_Lua - Fatal编程技术网

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

String Lua:在分隔字符串中查找标记,string,lua,String,Lua,我有一个字符串,其中包含一组分隔标记,如下所示: local str = "foo;bar;baz" function in_str($needle, $haystack) { return (bool)preg_match('/(^|;)' . preg_quote($needle, '/') . '(;|$)/', $haystack); } 我希望能够准确地判断给定令牌是否在此字符串中: in_str("foo", str) -- true in_str("bar", str)

我有一个字符串,其中包含一组分隔标记,如下所示:

local str = "foo;bar;baz"
function in_str($needle, $haystack) {
    return (bool)preg_match('/(^|;)' . preg_quote($needle, '/') . '(;|$)/', $haystack);
}
我希望能够准确地判断给定令牌是否在此字符串中:

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和正则表达式,我将通过以下方式实现所需的效果:

local str = "foo;bar;baz"
function in_str($needle, $haystack) {
    return (bool)preg_match('/(^|;)' . preg_quote($needle, '/') . '(;|$)/', $haystack);
}

不过,我不确定如何将这种逻辑转换为Lua。我也希望能够在香草Lua中实现,而不需要任何插件/扩展等。我还希望它能够合理高效。到目前为止,我能够正确实现这一点的唯一方法是将字符串拆分成一个表,然后对其进行迭代,这显然是非常低效的。

下面是一个代码示例:


由于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

这显然是非常低效的。
——为什么它显然是低效的?正则表达式通常比较慢。因为线性搜索是
O(n)
,而且每次拆分字符串都不算。除非您的字符串中有数千个标记(或者您正在处理数千个这样的字符串),否则这可能是过早的优化。如果您正在构建一个编译器,可能有更好的方法来实现这一点,比如将标记放入字典中。然后你会在O(1),而不是O(n)。这个函数每秒会被调用几十次,所以我不觉得这是过早的优化。这是一个实时系统?我编辑了这个答案,以修复一些出现误报/否定的情况。不过,这似乎是最有效的方法。谢谢。@drrcknlsn我自己也试过,虽然我的方法有点不同,是的,那个方法肯定更容错。