有效地在字符串中搜索一组字符并返回第一个匹配

时间:2016-06-14 07:41:26

标签: string performance lua match

我正在将vt100(oldschool终端)实现为lua,它运行在嵌入式MCU上。性能是一个问题。

给定是一个包含多个(不可预测的数字)字符的字符串(输入行)。 在这个字符串中,我想从一组字符中找到第一个匹配。

例如:

-- ASCII value(hex) of keyboard keys.
#define KEY_UP      "\x41"
#define KEY_DOWN    "\x42"
#define KEY_RIGHT   "\x43"
#define KEY_LEFT    "\x44"

-- terminal object is defined and created

function terminal:receive()
    -- Set buffer and shorthand to self.port.read
    local read = function() return self.port:read() end
    local received = ""

    while true do
        -- Read Input
        local line = read()
        if ( not line ) then break end
        received = received .. line

        -- Search for the key.
        -- Don't search in line, due different baudrates might not
        -- Get the entire digit at once.
        if ( received:find( KEY_UP ) ) then
            return KEY_UP
        elseif ( received:find( KEY_DOWN ) ) then
            return KEY_DOWN
        ... and so on
        end
    end
end

我的例子中的解决方案有点慢,当然。提出更高性能的解决方案并不难。但对此最有效的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

由于您的所有匹配都是一个字符长,您可以使用设置[]来匹配并捕获()以查看您匹配的内容。

#define KEY_UP      "\x41"
#define KEY_DOWN    "\x42"
#define KEY_RIGHT   "\x43"
#define KEY_LEFT    "\x44"
-- assemble pattern once for performance
local KEY_pattern = "([" .. KEY_UP .. KEY_DOWN .. KEY_RIGHT .. KEY_LEFT .. "])"

-- ............... skipped ...............
local match_start, match_end, match_content = received:find(KEY_pattern)
if ( match_content )  then
    return match_content
end

答案 1 :(得分:0)

您可以制作包含您要查找的所有字符的单个图案。然后,您可以捕获结果并将其返回。

如果您在要查找的角色中没有任何优先顺序,则此方法有效。