10

是否可以根据 Lua 中的列表替换字符,就像tr在 Perl 中一样?例如,我想替换AtoBBto A例如 AABBCCbecome BBAACC)。

在 Perl 中,解决方案是$str ~= tr/AB/BA/. 在 Lua 中是否有任何本地方法可以做到这一点?如果不是,我认为最好的解决方案是遍历整个字符串,因为单独的替换需要使用特殊符号来区分已经替换的字符和没有替换的字符。

编辑:我的目标是计算 DNA 字符串的反向补码,如此所述。

4

2 回答 2

14

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]",这样的单字符模式"."也可以工作,因为在表中找不到的任何内容都不会更改。(但我认为这不是更有效)但是对于一些更复杂的情况,需要一个好的模式。

下面是一个来自Programming in Lua的例子:这个函数用全局变量的值替换字符串varname中每次出现的值:$varname

function expand (s)
    return (string.gsub(s, "$(%w+)", _G))
end
于 2013-11-05T05:56:37.483 回答
1

下面的代码将用所需的映射替换每个字符(如果不存在映射,则不理会)。如果您知道字符的确切范围,您可以将第二个参数修改string.gsubtr更具体。

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-05T05:29:02.410 回答