Мне нужно подсчитать, сколько вхождений содержится в строке, но проверить наличие нескольких символов, а именно следующего (расширенные символы GSM 3.38):
€
[
\
]
^
{
|
}
~
Например. данная строка: abc€|€]/{def
Мне нужно число 6
С одним символом я использовал:
local _, c = addr:gsub("€","")
Так что с = 2
И это работает идеально. Может ли кто-нибудь заставить меня реализовать подсчет нескольких вхождений в строку?





local _, c = addr:gsub("€","") даст это c = 2, но если мы создадим группу [€], это даст c = 6, потому что € имеет ширину три байта, Lua видит ее как строку из 3 символов каждый в этой группе. Вы также можете увидеть это, изменив € на \226\130\172 в обоих примерах.
чтобы получить точное количество символов, как вы это описали, вы можете сделать 2 отдельных gsub с 2 шаблонами различий: один для символов с 3 байтами и один для одиночных байтов:
local str = "abc€|€]/{def"
local tripleByteCharPattern = "€"
local singleByteCharpattern = "[%[%]/^{|}~]"
local count = select(2, str:gsub(singleByteCharpattern, ""))
count = count + select(2, str:gsub(tripleByteCharPattern, ""))
print(count)
При использовании этого метода следует отметить одну вещь: если могут быть другие типы символов многобайтовой ширины, вы можете в конечном итоге идентифицировать один из ваших однобайтовых символов ВНУТРИ многобайтового символа, способы обхода этого обычно требуют определения начала многобайтовых символов. .
Большое спасибо, все работает идеально. Это хорошая отправная точка для продолжения моего проекта.