访客地图

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




下一篇: