Lua匹配带前缀的16位十六进制数

假设我有字符串/url/ID0123456789abcdef/bar,我想要找到和/或替换其中的ID0123456789abcdef。这个ID的形式总是由2个字母和16个十六进制数组成。

这是我所做的,不确定是否是最佳解决方案:

function replace_id(str, prefix, replace)
    local first, last = str:find(prefix)
    if first == nil then
        return str
    end

    local hex = str:sub(last - 1, last + 16)
    if not is_hex(hex) then
        return str
    end

    return replace_id(str:gsub(hex, replace), prefix, replace)
end

function utils.is_hex(str)
    if utils.is_str_empty(str) then
        return false
    end

    -- 字符串是字母数字和十六进制
    return str:gsub('%a', ''):gsub('%d', '') == '' and str:gsub('%x', '') == ''
end

print(replace_id('/url/ID0123456789abcdef/bar', 'ID', 'REPLACED'))
-- 打印 '/url/REPLACED/bar'

是否有更好的方法?

点赞
用户4984564
用户4984564

你正在使事情变得比必要的要难很多。

只需调用一次 string.gsub(),即可实现所需功能,而你所需要做的就是构建一个与所需匹配的模式,这相当容易。

唯一需要考虑的是,如果你想要构建包含“魔术”字符,比如 %. 的模式,你需要首先对它们进行转义,但这也不是很难,但似乎在你的情况下并不适用,因为你的前缀只包含字母字符。

function foo(str, prefix, replacement)
  return str:gsub(prefix..string.rep("%x", 16), replacement)
end

这可以很好地实现你的要求。

string.rep("%x", 16) ,顾名思义,重复字符串 16 次,构建一个 Lua 模式,可以匹配 16 个十六进制数字。

2018-09-28 06:42:19