Lua中string常用api用法整理

在使用 Lua 进行开发的时候,经常会用到一些 string 的 api,这里整理一下 Lua 中 string 常用的 api 的用法:

1、string.len(str):计算 str 的长度。

local str = "abc"
local len = string.len(str)
print(len)  -- 3

ps

在计算字符串长度的时候推荐使用 #str,性能更好!

local str = "abc"
local len = #str
print(len)  -- 3

2、string.find(str, pattern):查找 str 中第一个与 pattern 匹配的字符串,如果找到,返回与 pattern 匹配字符串在 str 中开始和结束位置的索引,如果没找到,返回 nil。

local str = "abcdefg"
local idx1, idx2 = string.find(str, "cdef")
print(idx1, idx2)  -- 3	6

local idx3, idx4 = string.find(str, "gh")
print(idx3, idx4)  -- nil	nil

ps

string.find(str, pattern[, init[, plain]]):在 string.find 的 api 中还有两个可选参数,init 为查找的起始位置,plain 为是否关闭模式匹配机制!

3、string.sub(str, i[, j]):截取 str,i、j 分别为开始和结束位置的索引,j 为可选参数,默认为 -1(即 str 最后一个字符的索引,也就是 str 的长度),返回截取后的子串。

local str = "abcdefg"
local sub_str = string.sub(str, 2, 4)
print(sub_str)  -- bcd

sub_str = string.sub(str, 2)
print(sub_str)  -- bcdefg

4、string.gsub(str, pattern, repl[, n]):字符串替换,将 str 中匹配 pattern 的子串替换为 repl,可选参数 n 为替换的次数,返回替换后的字符串和替换的次数。

local str = "I like you, I like everyone!"
local gsub_str, n = string.gsub(str, "like", "love")
print(gsub_str, n)  -- I love you, I love everyone!	2

gsub_str, n = string.gsub(str, "like", "love", 1)
print(gsub_str, n)  -- I love you, I like everyone!	1

ps

repl 不仅可以是字符串,还可以是 table 或者 function !

如果 repl 是 table,则会用匹配到的子串作为 key 在 table 中查找到对应的 value 进行替换。

local table = {
    a = 1,
    b = 2,
    c = 3
}
local str = "abbbc"
local gsub_str, n = string.gsub(str, "b", table)
print(gsub_str, n)  -- a222c	3

如果 repl 是 function,则会用匹配到的子串作为参数调用这个 function 。

local func = function(args)
    print("func args is ->", args)
end
local str = "abbbc"
local gsub_str, n = string.gsub(str, "b", func)
print(gsub_str, n)

-- func args is ->	b
-- func args is ->	b
-- func args is ->	b
-- abbbc	3

5、string.match(str, pattern[, init]):字符串匹配,与 string.find 类似,只是 string.find 返回的是第一个与 pattern 匹配的子串在 str 中起始位置的索引,而 string.match 返回的是第一个与 pattern 匹配的子串,如果在 str 中没有找到与 pattern 匹配的子串, string.match 和 string.find 一样都是返回 nil,可选参数 init 为在 str 中匹配的其实位置的索引,默认为 1 。

local str = "abc123def"
local match_str = string.match(str, "%d+")
print(match_str)  -- 123

match_str = string.match(str, "hello")
print(match_str)  -- nil

6、string.gmatch(str, pattern):返回一个迭代器函数,每调用一次这个函数进行一次匹配并返回匹配到的子串,需要配合 for 循环使用。

local str = "abc123def45gh6"
local num_str = ""
for s in string.gmatch(str, "%d+") do
    print(s)
    num_str = num_str .. s
end
print(num_str)

-- 123
-- 45
-- 6
-- 123456

7、string.format(formatstr, ...):格式化字符串。

local formatstr = "Can you give me %d apples?"
print(string.format(formatstr, 6))
-- Can you give me 6 apples?

formatstr = "I love %s forever!"
print(string.format(formatstr, "code"))
-- I love code forever!

formatstr = "This day is %s, yesterday is %s and tomorrow is %s!"
local dayTable = {"Tuesday", "Monday", "Wednesday"}
print(string.format(formatstr, unpack(dayTable)))
-- This day is Tuesday, yesterday is Monday and tomorrow is Wednesday!

formatstr = "%d, %02d, %03d, %f, %0.1f, %0.2f, %0.3f, %.1f, %.2f, %.3f"
print(string.format(formatstr, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1))
-- 1, 01, 001, 1.000000, 1.0, 1.00, 1.000, 1.0, 1.00, 1.000

8、string.byte(str[, i[, j]]):返回 str[i] 到 str[j] 的内部数字编码( ASCII 码 ),可选参数i的默认值为 1,可选参数 j 的默认值为 i 。

local str = "aA我们123"
print(string.byte(str))  -- 97
print(string.byte(str, 1))  -- 97
print(string.byte(str, 1, 7))  -- 97    65  230 136 145 228 187

9、string.char(...):与 string.byte 相反,接收零或更多的整数,返回和参数数量相同长度的字符串, 其中每个字符的内部编码值( ASCII 码值 )等于对应的参数值。

local char = string.char(97)
print(char)  -- a

char = string.char(37, 60)
print(char)  -- %<

--------------------add on Oct. 31, 2019--------------------

保留两位小数:

local testFloat = 3.1415926
local ret = tonumber(string.format("%.2f", testFloat))
print(ret)
-- 3.14

 

暂时就整理一下这些常用的,其他的可以查阅云风大大的Lua5.3 参考手册

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fightsyj

您的鼓励将是我分享的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值