String LUA计数字符串中的重复字符

String LUA计数字符串中的重复字符,string,lua,count,symbols,String,Lua,Count,Symbols,我有一个字符串“A001BBD0”,我想知道以下信息: 0重复3次 B重复2次 就这样 我在web上发现了这个模式:([a-zA-Z]).*(\1)”但出于某种原因,它总是返回nil 我想我应该拆分这个字符串,并在几个循环中检查每个符号。我认为这不是一个好主意(低性能) 我也找到了topic,但它没有给我任何信息gsub返回替换的数量。因此,请尝试以下代码: function repeats(s,c) local _,n = s:gsub(c,"") return n end

我有一个字符串“A001BBD0”,我想知道以下信息:

  • 0重复3次
  • B重复2次
就这样

我在web上发现了这个模式:([a-zA-Z]).*(\1)”但出于某种原因,它总是返回nil

我想我应该拆分这个字符串,并在几个循环中检查每个符号。我认为这不是一个好主意(低性能)


我也找到了topic,但它没有给我任何信息

gsub
返回替换的数量。因此,请尝试以下代码:

function repeats(s,c)
    local _,n = s:gsub(c,"")
    return n
end

print(repeats("A001BBD0","0"))
print(repeats("A001BBD0","B"))

为每个字母数字字符创建一个记录将提供一个更通用的解决方案

local records = {} -- {['char'] = #number of occurances}
s = "A001BBD0"
for c in string.gmatch(s, "%w") do
    if records[c] then
        records[c] = records[c] + 1
    else
        records[c] = 1
    end
end

for k,v in pairs(records) do
    if(v > 1) then -- print repeated chars
        print(k,v)
    end
end
-- Output:
-- 0    3
-- B    2

前面关于三元运算符使用的答案的简短版本

local records = {}
s = "A001BBD0"
for c in string.gmatch(s, "%w") do
    records[c] = records[c] and records[c] + 1 or 1
end

for k,v in pairs(records) do
    if(v > 1) then -- print repeated chars
        print(k,v)
    end
end

顺便说一句,是卢阿,不是卢阿。对不起)我不知道这很重要。谢谢,这很有效。但现在我有另一个问题。我也使用俄语字母作为模式[АСББММССП],但出于某种原因,它会计数两次。我不明白为什么你会被数两次哪个俄语字母?A(这个字母看起来像英语A,但它不是)当我打印俄语单词(在所有函数之后)时,我总是得到空字符串(idk为什么)。我尝试使用string.byte/string.char来避免这个问题-结果相同。我想Lua不支持其他语言如果你想计算俄语字母(而不是其他字符,比如空格),你可能必须安装一个库,比如,它包含Lua字符串匹配函数的版本,其中西里尔字母由字符类
“%w”
匹配。或者,您可以通过将本文循环中的
utf8.charpattern
替换为
utf8.charpattern
来计算所有UTF-8字符(假设您使用的是Lua版本5.3),然后您将获得关于西里尔文字符的信息。将
string.gmatch(s,“%w”)
替换为
string.gmatch(s,[^%s%c%p\128-\191][\128-\191]*”)
处理俄语字母。记录[c]=(记录[c]或0)+1