在使用 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 参考手册!