是否可以根据Lua中的列表替换字符,例如Perl中的tr
?例如,我想用A
代替B
,用B
代替A
(例如AABBCC
变成BBAACC
)。
在Perl中,解决方案是$str ~= tr/AB/BA/
。在Lua中有任何本地方法可以做到这一点吗?如果没有,我认为最好的解决方案是遍历整个字符串,因为单独的替换需要使用特殊的符号来区分已被替换的字符和未被替换的字符。
编辑:我的目标是计算DNA字符串的反向互补,如here所述。
最佳答案
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