Lua:替换字符串中的字符列表

时间:2013-11-05 04:57:27

标签: string lua substitution lua-patterns

是否可以根据Lua中的列表替换字符,例如Perl中的tr?例如,我想将A替换为B,将B替换为A例如 AABBCC变为{{1} })。

在Perl中,解决方案是BBAACC。在Lua有这种本地方式吗?如果没有,我认为最好的解决方案是迭代整个字符串,因为单独的替换需要使用特殊符号来区分已经替换的字符和非字符的字符。

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

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:1)

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

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