基于未知分隔符的字符串拆分(而不是分隔符的长度)

时间:2012-09-20 18:54:51

标签: string lua

我有一个有点深奥的问题。我的程序想要解码摩尔斯电码。

关键是,我需要处理任何字符。任何符合我的系统并且可以对应于字母的随机字符都应该被接受。意思是,字母“Q”由“ - - 。 - ”表示,但我的程序会将任何字符串(由适当的newchar信号分隔)视为Q,例如“dj ir j kw”(long long短暂的。)

存在失去同步的危险,因此我需要实现“新角色”信号。我选择这个是“xxxx”,如4个字母。对于白色空格符号,我选择了“xxxxxx”,6个字符。

长话短说,如何根据分隔符的长度(4个连续符号)将要解码的字符串拆分为可读字符,因为我无法确定地知道< em>什么字母组成newchar分隔符?

1 个答案:

答案 0 :(得分:1)

问题的措辞不是很明确。

例如,在这里,您将空格显示为符号Q:

的各个部分之间的分隔符
  

例如“dj ir j kw”(long long short long)

后来你说:

  

对于白色空格符号,我选择了“xxxxxx”,6个字符。

这是空格的符号,还是在符号中使用的分隔符(例如上面的Q)?你的帖子没有说。

在这种情况下,一如既往,一个例子值得千言万语。您应该已经展示了一些可能的输入示例,并展示了您希望如何解析它们。

如果你的意思是“dj ir j kw jfkl abpzoq jfkl dj ir j kw”应解码为“QQ”,你只想知道如何按照长度匹配令牌,那么......问题简单。有一百万种方法可以做到这一点。

在Lua,我会分两次通过。首先,将消息转换为仅包含每个连续字符长度的字符串:

message = 'dj ir j kw jfkl abpzoq jfkl dj ir j kw'

message = message:gsub('(%S+)%s*', function(s) return #s end)

print(message) --> 22124642212

然后拆分数字4以获得每个组

for group in message:gmatch('[^4]+') do
    print(group)
end

这给了你:

2212
6
2212

所以你可以转换这样的东西:

function translate(message)
    local lengthToLetter = {
        ['2212'] = 'Q',
        [   '6'] = ' ',
    }
    local translation = {}
    message = message:gsub('(%S+)%s*', function(s) return #s end)
    for group in message:gmatch('[^4]+') do
        table.insert(translation, lengthToLetter[group] or '?')
    end
    return table.concat(translation)
end

print(translate(message))