zoukankan      html  css  js  c++  java
  • lua string方法拓展

    --[[--
    用指定字符或字符串分割输入字符串,返回包含分割结果的数组
    local input = "Hello,World"
    local res = string.split(input, ",")
    -- res = {"Hello", "World"}
    
    local input = "Hello-+-World-+-Quick"
    local res = string.split(input, "-+-")
    -- res = {"Hello", "World", "Quick"}
    
    @param string input 输入字符串
    @param string delimiter 分割标记字符或字符串
    @return array 包含分割结果的数组
    ]]
    function string.split(input, delimiter)
        input = tostring(input)
        delimiter = tostring(delimiter)
        if (delimiter=='') then return false end
        local pos,arr = 0, {}for st,sp in function() return string.find(input, delimiter, pos, true) end do
            table.insert(arr, string.sub(input, pos, st - 1))
            pos = sp + 1
        end
        table.insert(arr, string.sub(input, pos))
        return arr
    end
    
    --[[--
    去除输入字符串头部的空白字符,返回结果
    local input = "  ABC"
    print(string.ltrim(input))
    -- res ABC,输入字符串前面的两个空格被去掉了
    
    空白字符包括:
    -   空格
    -   制表符 	
    -   换行符 
    
    -   回到行首符 
    @param string input 输入字符串
    @return string 结果
    @see string.rtrim, string.trim
    ]]
    function string.ltrim(input)
        return string.gsub(input, "^[ 	
    
    ]+", "")
    end
    --[[-- 去除输入字符串尾部的空白字符,返回结果 local input = "ABC " print(string.ltrim(input)) -- res ABC,输入字符串最后的两个空格被去掉了

    @param string input 输入字符串 @return string 结果 @see string.ltrim, string.trim ]] function string.rtrim(input) return string.gsub(input, "[ ]+$", "") end
    --[[-- 去掉字符串首尾的空白字符,返回结果 @param string input 输入字符串 @return string 结果 @see string.ltrim, string.rtrim ]] function string.trim(input) input = string.gsub(input, "^[ ]+", "") return string.gsub(input, "[ ]+$", "") end --[[-- 将字符串的第一个字符转为大写,返回结果 local input = "hello" print(string.ucfirst(input)) -- res Hello @param string input 输入字符串 @return string 结果 ]] function string.ucfirst(input) return string.upper(string.sub(input, 1, 1)) .. string.sub(input, 2) end--[[-- 计算 UTF8 字符串的长度,每一个中文算一个字符 local input = "你好World" print(string.utf8len(input)) -- res 7
    @param string input 输入字符串 @return integer 长度 ]] function string.utf8len(input) local len = string.len(input) local left = len local cnt = 0 local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc} while left ~= 0 do local tmp = string.byte(input, -left) local i = #arr while arr[i] do if tmp >= arr[i] then left = left - i break end i = i - 1 end cnt = cnt + 1 end return cnt end
    ----过滤出规范字符 只保留汉字、数字、字符
    function string.filterSpecChars(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
    
    
    --[[--
    将数值格式化为包含千分位分隔符的字符串
    print(string.formatnumberthousands(1924235))
    -- 输出 1,924,235
    
    @param number num 数值
    @return string 格式化结果
    ]]
    function string.formatnumberthousands(num)
        local formatted = tostring(checknumber(num))
        local k
        while true do
            formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
            if k == 0 then break end
        end
        return formatted
    end
    -- 判断utf8字符byte长度
    -- 0xxxxxxx - 1 byte
    -- 110yxxxx - 192, 2 byte
    -- 1110yyyy - 225, 3 byte
    -- 11110zzz - 240, 4 byte
    local function chsize(char)
        if not char then
            print("not char")
            return 0
        elseif char > 240 then
            return 4
        elseif char > 225 then
            return 3
        elseif char > 192 then
            return 2
        else
            return 1
        end
    end
    
    -- 截取utf8 字符串
    -- str:         要截取的字符串
    -- startChar:   开始字符下标,从1开始
    -- numChars:    要截取的字符长度
    function string.utf8sub(str, startChar, numChars)
        local startIndex = 1
        while startChar > 1 do
            local char = string.byte(str, startIndex)
            startIndex = startIndex + chsize(char)
            startChar = startChar - 1
        end
    
        local currentIndex = startIndex
    
        while numChars > 0 and currentIndex <= #str do
            local char = string.byte(str, currentIndex)
            currentIndex = currentIndex + chsize(char)
            numChars = numChars -1
        end
        return str:sub(startIndex, currentIndex - 1)
    end
    
    --判断字符串是否为nil或““ function
    string.IsNilOrEmpty(str) if not str or str == "" then return true end return false end
  • 相关阅读:
    hdu 3790 最短路径问题
    hdu 2112 HDU Today
    最短路问题 以hdu1874为例
    hdu 1690 Bus System Floyd
    hdu 2066 一个人的旅行
    hdu 2680 Choose the best route
    hdu 1596 find the safest road
    hdu 1869 六度分离
    hdu 3339 In Action
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/unknown6248/p/13031125.html
Copyright © 2011-2022 走看看