lua 之 string

注:本篇文章从个人博客园移植而来

常用方法
  • string.len(str) 返回字符串长度
print(string.len("123"))     -- 3
print(string.len(" "))       -- 1
  • string.rep(str,n) 返回重复n次的str的字符串
-- 关于次数,针对于测试需要,我们可以设定很大的数值
print(string.rep("s",5))     -- sssss
  • string.lower(str) 将字符串str中的大写字母转换为小写字母
local str = "Hello Lua"
print(string.lower(str))     -- hello lua

-- 我们也可以用于对字符串进行排序
local strTab  = {"Hello", "Abort", "Lua"}
table.sort(strTab, function(a,b)
    return string.lower(a) < string.lower(b)
end)
local newStr = table.concat(strTab, ",")
print(newStr)                 -- Abort,Hello,Lua
  • string.upper(str) 将字符串str中的小写字母转换为大写字母
print(string.upper("Hello Lua"))         -- HELLO LUA
  • string.reverse(str) 将字符串str反转
print(string.reverse("EDCBA"))             -- ABCDE

-- 类似实现
local _tab = {}
local str = "EDCBA";
-- 倒序遍历字符串
for i = #str, 1, -1 do 
    -- 截取字符,并存放到列表中
    local char = string.sub(str,i,i)
    table.insert(_tab, char)
end 

-- 字符串连接列表
local newstr = table.concat(_tab)
print(newstr)														-- ABCDE
  • string.sub(str, i, j) 将字符串str从第 i 位置截取到第 j 位置。如果第三个参数没有,将默认为-1
local str = "Hello Lua"
-- 从起始位置截取到末尾,结尾索引未添加,默认-1
print(string.sub(str,1))             -- Hello Lua
print(string.sub(str,1,-1))          -- Hello Lua
print(string.sub(str,1,#str))        -- Hello Lua

-- 从中间位置截取任意字符串,结尾索引可使用负数,从后往前-1,-2, ...
print(string.sub(str, 2, 4))         -- ell
print(string.sub(str, 2,-6))         -- ell
print(string.sub(str, -8, -6))       -- ell

-- 注意:使用string.sub以及其他操作方法,不会改变原有字符串的值,而是返回新的字符串
print(str)                           -- Hello Lua
  • string.char(num1,num2, …) 用于将一个或多个数字转换为字符,并返回又这些字符连接起来的字符串
print(string.char(101))                    -- e
print(string.char(108,111,118,101))        -- love
  • string.byte(str,index) 用于将字符串str的第 index 个字符转换为整数,其第二个参数未填写会默认为1
print(string.byte("love", 4))             -- 101
print(string.byte("love", -1))            -- 101
--[[
-- 注意:由于lua语言限制了栈大小,所以也限制了返回值的最大个数
默认最大为100W个,因此不能用于大小超过1M的字符串
]]
  • string.format() 用于格式化字符串,类似于C语言的printf
-- 十进制:%d 十六进制:%x 八进制:%o 浮点数:%f 字符串:%s
print(string.format("Number:%d",1))         -- Number:1
print(string.format("Number:%d",1.2))       -- Number:1
print(string.format("Float:%f",1))          -- Float:1.000000

-- 可以对于数字进行补位,%2d代表代表不足位数以空格代替,%04d代表不足位数以0代替
print(string.format("数字:%d/%2d/%04d",1,2,3))     -- 数字: 数字:1/ 2/0003

-- 可以使用小数对浮点数后面的位数进行限定
print(string.format("Float:%0.2f",1.2345))    -- Float:1.23
print(string.format("Float:%.2f",1.2345))     -- Float:1.23
print(string.format("Float:%0.2f", 1.5678))	  -- Float:1.57  使用此种方式,会进行四舍五入
  • string.find(str,pattern) 根据目标字符串str搜索找到pattern字符或字符串的起始位置和结束位置,如果没有返回nil
local str = "Hello, today is 2019/1/11 at 18:30 PM"
-- 查找正确,返回字符或字符串的起始位置,结束位置
local startPos, endPos = string.find(str,'H')
print(startPos,endPos)                         -- 1    1
local startPos, endPos = string.find(str,"Hello")
print(startPos,endPos)                         -- 1    5

-- 查找错误,返回nil
local startPos,endPos = string.find(str,"Wang")
print(startPos,endPos)                         -- nil    nil

-- 可以根据string.find获取的位置来获取指定字符串
local newStr = string.sub(str,1,5)
print(newStr)                                  -- Hello
  • string.gsub(str,modelstr,replacestr,pos) 在字符串str中查找modelstr,并将其替换为replacestr,其pos用于限制替换范围。

有两个返回值,第一个是替换后的字符串,第二个是替换的次数

local str = "Hello, Python"
local newStr = string.gsub(str,"Python", "Lua")
print("源字符串:" .. str)                     -- 源字符串:Hello, Python
print("新字符串:" .. newStr)                 -- 新字符串:Hello, Lua

-- 倘若字符串没找到替换的,不变
local newStr = string.gsub(str,"C++", "Lua")
print("新字符串:" .. newStr)                 -- 新字符串:Hello, Python

-- 通过第四个参数来限定替换的次数
local newStr,count = string.gsub("all lii", "l","x")
print(newStr,count)          -- axx xii    3
local newStr,count = string.gsub("all lii", "l","x",3)
print(newStr,count)          -- axx xii    3
local newStr,count = string.gsub("all lii", "l","x",2)
print(newStr,count)          -- axx lii    2
local newStr,count = string.gsub("all lii", "l","x",1)
print(newStr,count)          -- axl lii    1

拓展
-- 摘抄于cocos2d/functions.lua
string._htmlspecialchars_set = {}
string._htmlspecialchars_set["&"] = "&amp;"
string._htmlspecialchars_set["\""] = "&quot;"
string._htmlspecialchars_set["'"] = "&#039;"
string._htmlspecialchars_set["<"] = "&lt;"
string._htmlspecialchars_set[">"] = "&gt;"

function string.htmlspecialchars(input)
    for k, v in pairs(string._htmlspecialchars_set) do
        input = string.gsub(input, k, v)
    end
    return input
end

function string.restorehtmlspecialchars(input)
    for k, v in pairs(string._htmlspecialchars_set) do
        input = string.gsub(input, v, k)
    end
    return input
end

function string.nl2br(input)
    return string.gsub(input, "\n", "<br />")
end

function string.text2html(input)
    input = string.gsub(input, "\t", "    ")
    input = string.htmlspecialchars(input)
    input = string.gsub(input, " ", "&nbsp;")
    input = string.nl2br(input)
    return input
end

function string.split(input, delimiter)
    input = tostring(input)
    delimiter = tostring(delimiter)
    if (delimiter=='') then return false end
    local pos,arr = 0, {}
    -- for each divider found
    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

function string.ltrim(input)
    return string.gsub(input, "^[ \t\n\r]+", "")
end

function string.rtrim(input)
    return string.gsub(input, "[ \t\n\r]+$", "")
end

function string.trim(input)
    input = string.gsub(input, "^[ \t\n\r]+", "")
    return string.gsub(input, "[ \t\n\r]+$", "")
end

function string.ucfirst(input)
    return string.upper(string.sub(input, 1, 1)) .. string.sub(input, 2)
end

local function urlencodechar(char)
    return "%" .. string.format("%02X", string.byte(char))
end
function string.urlencode(input)
    -- convert line endings
    input = string.gsub(tostring(input), "\n", "\r\n")
    -- escape all characters but alphanumeric, '.' and '-'
    input = string.gsub(input, "([^%w%.%- ])", urlencodechar)
    -- convert spaces to "+" symbols
    return string.gsub(input, " ", "+")
end

function string.urldecode(input)
    input = string.gsub (input, "+", " ")
    input = string.gsub (input, "%%(%x%x)", function(h) return string.char(checknumber(h,16)) end)
    input = string.gsub (input, "\r\n", "\n")
    return input
end

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

-- 比如: 99999999 --> 99,999,999
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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤九日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值