Lua: 将字符串中的一组字符替换

在 Lua 中是否有像 Perl 中的 tr 一样的按照列表替换字符的方法?例如,我想把 A 替换成 B,把 B 替换成 A(例如,AABBCC 变成 BBAACC)。在 Perl 中,解决方案是 $str ~= tr/AB/BA/。在 Lua 中是否有本机的解决方案?如果没有,我认为最好的解决方案是遍历整个字符串,因为单独的替换需要使用特殊符号来区分已经被替换和未被替换的字符。编辑:我的目标是计算 DNA 字符串的 _反相互补_(如此处所述)。

点赞
用户2303714
用户2303714

下面的代码将每个字符都替换为所需的映射(如果没有映射存在,则保持不变)。 如果您知道字符的确切范围,则可以修改 "tr" 中 "string.gsub" 的第二个参数为更具体的内容。

s = "AABBCC"
mappings = {["A"]="B",["B"]="A"}

function tr(s,mappings)
    return string.gsub(s,
        "(.)",
        function(m)
            -- print("found",m,"replace with",mappings[m],mappings[m] or m)
            if mappings[m] == nil then return m else return mappings[m] end
        end
    )
end

print(tr(s,mappings))

输出结果为

henry@henry-pc:~/Desktop$ lua replace.lua
found   A   replace with    B   B
found   A   replace with    B   B
found   B   replace with    A   A
found   B   replace with    A   A
found   C   replace with    nil C
found   C   replace with    nil C
BBAACC  6
2013-11-05 05:29:02
用户1009479
用户1009479

string.gsub 函数可以接受一个表作为第三个参数。对于每一个匹配到的字符串,都会去查询这个表,使用第一个捕获到的字符串作为键,对应的值会被用来替换匹配到的字符串。如果这个值为 nil,则匹配到的字符串不会被改变。

你可以像下面这样构建一个帮助表:

local s = "AABBCC"
local t = {A = "B", B = "A"}
local result = string.gsub(s, "[AB]", t)
print(result)

或者像下面这个一行命令:

print((string.gsub("AABBCC", "[AB]", {A = "B", B = "A"})))

输出结果:

BBAACC

对于一个只有一个字符的模式 "[AB]" 来说,使用 "." 也可以,因为表中找不到的任何值都不会被改变。(但我认为这样并不更加有效)但对于一些更复杂的情况,需要一个好的模式。

下面是《Lua 编程》一书中的一个例子:此函数将全局变量 varname 的值替换成包含 $varname 的字符串中的每一个。

function expand (s)
    return (string.gsub(s, "$(%w+)", _G))
end
2013-11-05 05:56:37