匹配字符串转换为单词但保留多个空格的正则表达式

以下是我的期望结果。我有一个包含数字的字符串需要转换成字母(一种密码)和空格以移动到不同的字母位置,并且有一个表示空格的三倍空格。例如,字符串 "394 29 44 44 141 6" 将被解密为 "Hell No"。

function string.decrypt(self)
    local output = ""

    for i in self:gmatch("%S+") do
        for j, k in pairs(CODE) do
            output = output .. (i == j and k or "")
        end
    end

    return output
end

尽管它能正确地解密数字,但不适用于空格。所以我用的字符串解密为"HellNo",而不是期望的"Hell No"。我该如何解决?

点赞
用户3832970
用户3832970

你可以使用以下代码:

CODE = {["394"] = "H", ["29"] = "e", ["44"] = "l", ["141"] = "N", ["6"] = "o"}
function replace(match)
    local ret = nil
    for i, v in pairs(CODE) do
        if i == match then
            ret = v
        end
    end
    return ret
end

function decrypt(s)
    return s:gsub("(%d+)%s?", replace):gsub("  ", " ")
end

print(decrypt("394 29 44 44   141 6"))

输出将包含 Hell No。请查看 Lua demo online

s:gsub("(%d+)%s?", replace)中,(%d+)%s?匹配并捕获一个或多个数字,并仅匹配可选的空格(使用 %s?),捕获的值传递给 replace 函数,在该函数中将其映射到 CODE 中的字符值。然后,使用 gsub(" ", " ")替换所有双倍空格为单个空格。

2020-09-24 20:36:03