lua中自定义字符匹配(包括汉字与特殊号)
张成
2014/11
在游戏开发中,我们使用lua过滤关键字符,匹配字符正确性,但lua中没有完整的posix规范的正则匹配,只有简单的string.gsub string.find ,我们可以利用字符的实际存储数值来比较,string.byte方法可以得到lua中字符实际的存储的数值,通过转换数值来比较。汉字与特殊符号都有数值区间,字母数字都在ascii码范围内。下面贴上我自己写的一个,带自定义规范的可以判断字母数字汉字以及一些额外的可以输入的字符的函数。
--是否是合格字符串 function isLegal(str) local len = string.len(str) local base = {} local basePregStr = "_,.!?;:" --这里可以定义一些符合自己要求的字符 local basePregStrLen = string.len(basePregStr) for i=1,basePregStrLen do table.insert(base,string.byte(basePregStr,i,i)) end --0-9 a-z A-Z local numCode = string.byte("0",1,1) for i=1,10 do table.insert(base,numCode) numCode = numCode + 1 end local wordCode_lower = string.byte("a",1,1) local wordCode_upper = string.byte("A",1,1) for i=1,26 do table.insert(base,wordCode_lower) table.insert(base,wordCode_upper) wordCode_upper = wordCode_upper + 1 wordCode_lower = wordCode_lower + 1 end -- for k,v in pairs(base) do -- print(k,'=>',string.format("%c",v)) -- end function isInBase(n) local isIn = false for _,v in pairs(base) do if v == n then isIn = true break end end return isIn end local count = 0 for i=1,len do if count > 0 then count = count - 1 else print("i=>",i) local strNum = string.byte(str,i,i) if strNum < 127 then --汉字大于127 if isInBase(strNum) == false then print("不在base中",i) return false end else --判断是否 是汉字 而不是特殊字符 local s1 = strNum local s2 = string.byte(str,i+1,i+1) local s3 = string.byte(str,i+2,i+2) local s4 = s1..''..s2..''..s3 local num = tonumber(s4) -- 汉字4e00 9fa5 -- lua中的范围 228184128 233190165 if num < 228184128 or num > 233190165 then return false end count = 2 end end end return true end