string.find()函数解析
string.find (s, pattern [, init [, plain]])
s: 源字符串
pattern: 待搜索模式串
init: 可选, 起始位置,这个数字默认为1可以一个负数,表示从后往前数的字符个数
plain: 可选,默认为flase,传入参数true表示关闭模式匹配
-- 这个函数如其名,用来查找匹配的pattern,返回该pattern的索引。
-- 找到一个匹配就返回。如果找不到,返回空。
-- 函数内部不会判断s长度是否小于pattern,使用时需要注意
使用实例,匹配屏蔽字库内字符串并转换为 ‘*’
function ChangeString(str)
-- print(str)
for k, v in pairs(LIMITED_MSG) do --LIMITED_MSG屏蔽字库
if string.len(str)>=string.len(v) then --一定要添加长度判断,如果str长度小于v会返回非空
if string.find (str, v, 1) then
print(v)
local star = showStar(v) -- 制作一个与匹配到字符串长度一致的 '*' 字符串
print(star)
str = string.gsub(str, v, star) --将 '*' 字符串替换到目标字符串中
end
end
end
-- print(str)
GAR_str = str
end
function showStar(str)
local len = widthSingle(str) --计算字符串长度
local star = ""
for i = 1,len do
star = star.."*"
end
-- print(star)
return star
end
function widthSingle(inputstr)
-- 计算字符串宽度
-- 可以计算出字符宽度,用于显示使用
local lenInByte = #inputstr
local width = 0
local i = 1
while (i<=lenInByte)
do
local curByte = string.byte(inputstr, i)
local byteCount = 1;
if curByte>0 and curByte<=127 then
byteCount = 1 --1字节字符
elseif curByte>=192 and curByte<223 then
byteCount = 2 --双字节字符
elseif curByte>=224 and curByte<239 then
byteCount = 3 --汉字
elseif curByte>=240 and curByte<=247 then
byteCount = 4 --4字节字符
end
if curByte==46 then
--print(333333333333333)
return 6
end
local char = string.sub(inputstr, i, i+byteCount-1)
--print(char)
i = i + byteCount -- 重置下一字节的索引
width = width + 1 -- 字符的个数(长度)
end
return width
end
去除字符串中的符号进而检测屏蔽字
string.char()与string.byte()
string.char(…)
接收0个或者多个参数,返回一个字符串,字符串长度等于参数个数,
前提是每一参数作为ASCII码都有一个字符与之相对应,也就是说大部分的数字是无效的,
这个函数参数的ASCII码在跨平台方面不一定是可移植的。
string.byte (s [, i [, j] ])
函数返回字符s[i], s[i+1], ···, s[j]的内部数字编码(ASCII码),其中参数i的默认值是1,而参数j的默认值是i。
需要注意的是该函数在返回的数字编码在跨平台方面不一定是可移植的。
function delCode(s)
local ss = {}
local k = 1
while true do
if k > #s then break end
local c = string.byte(s,k)
if not c then break end
if c<192 then
if (c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122) then
table.insert(ss, string.char(c))
end
k = k + 1
elseif c<224 then
k = k + 2
elseif c<240 then
if c>=228 and c<=233 then
local c1 = string.byte(s,k+1)
local c2 = string.byte(s,k+2)
if c1 and c2 then
local a1,a2,a3,a4 = 128,191,128,191
if c == 228 then a1 = 184
elseif c == 233 then a2,a4 = 190,c1 ~= 190 and 191 or 165
end
if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
table.insert(ss, string.char(c,c1,c2))
end
end
end
k = k + 3
elseif c<248 then
k = k + 4
elseif c<252 then
k = k + 5
elseif c<254 then
k = k + 6
end
end
return table.concat(ss)
end