Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Lua:字符串中字符的替换列表_String_Lua_Substitution_Lua Patterns - Fatal编程技术网

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

String Lua:字符串中字符的替换列表,string,lua,substitution,lua-patterns,String,Lua,Substitution,Lua Patterns,是否可以根据Lua中的列表替换字符,比如Perl中的tr?例如,我想将A替换为B,将B替换为A(例如AABBCC变成BBAACC) 在Perl中,解决方案是$str~=tr/AB/BA/。在Lua有没有什么本地的方法可以做到这一点?如果不是,我认为最好的解决方案是遍历整个字符串,因为单独的替换需要使用特殊符号来区分已替换的字符和未替换的字符 编辑:我的目标是计算DNA字符串的反向补码,如前所述。下面的代码将用所需的映射替换每个字符(如果不存在映射,则不使用)。如果您知道字符的确切范围,可以在tr

是否可以根据Lua中的列表替换字符,比如Perl中的
tr
?例如,我想将
A
替换为
B
,将
B
替换为
A
(例如
AABBCC
变成
BBAACC

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


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

下面的代码将用所需的映射替换每个字符(如果不存在映射,则不使用)。如果您知道字符的确切范围,可以在
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
可以将表作为第三个参数。将使用第一个捕获作为键查询每个匹配的表,并将关联的值用作替换字符串。如果该值为
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我不知道gsub的表格形式。比我使用的函数方法好得多。很好的解决方案!你认为用
(匹配每个字符)替换
”[A | B]“
会更有效吗?我已经测试过了,结果是一样的。@FábioPerez是的\@YuHao lua模式不支持像regex一样的
|
匹配。此外,
[AB]
也同样有效。