LUA количество повторяющихся символов в строке - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть строка "A001BBD0", и я хочу знать эту информацию:

  • 0 повторяется 3 раза
  • B повторяется 2 раза

и все.

Я нашел этот шаблон в сети: "([a-zA-Z]). * (\ 1)", но по какой-то причине он всегда возвращает ноль

Полагаю, мне следует разбить эту строку и проверить каждый символ в нескольких циклах. Я не думаю, что это хорошая идея (низкая производительность)

я также нашел эту тему, но она не дает мне никакой информации

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Создание записи для каждого буквенно-цифрового символа даст более общее решение

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
0 голосов
/ 09 ноября 2018

Укороченная версия предыдущего ответа об использовании троичного оператора

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
0 голосов
/ 08 ноября 2018

gsub возвращает количество замен. Итак, попробуйте этот код:

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

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