lua string 下的函数
lua的字符串操作
lua的字符串绝大部分的操作 都可以用 string 库函数接口操作,只是因为lua的特性,在匹配操作上会有些不一样,这个文末会说一点。
另外 lua 的字符串是 从 下标 1 开始的,不是 0 开始。
函数操作:
1. 计算字符串长度
例如:string.len("abcd"); ----> 4
2. 返回字符串 s 的 n 个拷贝
例如:string.rep("abcd",2) ----> abcdabcd
3. 返回字符串的全部大写
例如:string.upper("AbcD") ----> ABCD
4. 返回字符串的全部小写
例如:string.lower("AbcD") ----> abcd
5. 字符串的拼接【字符串的格式化操作】
例如:string.format("the value is:%d",4) ----> the value is:4
6. 根据下标截取字符串 这个下标是取的 闭区间长度 ,string.sub(info, index, endindex)
例如:string.sub("abcd",2) ----> bcd
string.sub("abcd",-2) ----> cd
string.sub("abcd",2,-2) ----> bc
string.sub("abcd",2,3) ----> bc
7. 在字符串中查找 string.find()
- 原型:string.find (s, pattern [, init [, plain]])
- 解释:函数在字符串
s
里查找第一个和参数pattern
匹配的子串,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,否则就会返回nil
。
另外,参数init
作为一个数字,指定了搜索的起始位置,这个数字默认为1可以一个负数,表示从后往前数的字符个数。
参数plain
作为第四个可选参数默认为flase,传入参数true表示关闭模式匹配,所以函数只做简单的查找子串的操作,
如果子串pattern
没有字符为空字符串""
将会被认为是魔法字符。
如果模式匹配子串被找到了,一个成功被找到的子串将会作为第三个返回值,放在两个索引返回值的后边而返回。
- 如果 pattern 匹配模式是 带有 (...) 就是有括号这种,是捕获组形式,那find函数会返回匹配到的 字符串 。
- 比如: a,b,str = string.find('qwe123', '(%a+)') ----> 1 3 qwe
- 如果是完全的字符串查找,没有正则匹配,例如: string.sub("abcd",2) ----> bcd
string.sub("abcd",-2) ----> cd
string.sub("abcd",2,-2) ----> bc
string.sub("abcd",2,3) ----> bc
8. 在字符串中查找并替换 string.gsub(mainString,pattern,replaceString,num)
在字符串中替换。mainString 为要操作的字符串, pattern为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)
例如:string.gsub("abcdabcd","a","z"); ----> zbcdzbcd 2
string.gsub("aaaa","a","z",3); ----> zzza 3
9. 返回字符串的ASCII码 string.byte()
例如:string.byte("ABCD",4) ----> 68
10. 将ASCII码变成 字符串 string.char()
例如:string.char(97,98,99,100) ----> abcd
11. 分割字符串 string.split(要分割的字符串, 分隔符)
例如:local result = string.split("1,2,3", ",") ----> result = {"1", "2", "3"}
12. 字符串反转 string.reverse(s)
例如:string.reverse("jayden") ----> nedyaj
13. 字符串匹配 string.match (s, pattern)
string.find()
要返回匹配字符的索引,也不同于string.gmatch()
函数会返回一个迭代函数可以取到所有的匹配项,- 原型:string.match(s, pattern [, init])
- 解释:在字符串
s
中查找满足参数pattern
的匹配子串,如果找到了一个匹配就返回这个匹配子串,若没找到则返回nil
,如果参数pattern
没有指定匹配参数,则返回整个匹配字符串,另外,一个数字形参数init
用来指定查找字符串的其实位置,这个参数默认为1,当然也可以设置为负数,即-n
表示从字符串尾部向前数n个字符开始查找。 - pattern 可以 是 正则匹配 字符串,那 这个函数返回的就是 能匹配到的 字符串。
match_ret = string.match(
ehre99wj=--=-*-/4mdqwl\0ds123fef
, "%d%d%d") ---> 123
14. 字符串匹配迭代返回 string.gmatch (s, pattern)
匹配字符串s中的pattern , 返回一个迭代器函数, 每次调用该迭代器函数,返回下一个子串。
字符串拼接【字符串格式化】
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:
(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%.nf)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%.ns)则设定该字符串只显示前n位.
例如
string.format("%c", 83) -- 输出S
string.format("%+d", 17.0) -- 输出+17
string.format("%05d", 17) -- 输出00017
string.format("%o", 17) -- 输出21
string.format("%u", 3.14) -- 输出3
string.format("%x", 13) -- 输出d
string.format("%X", 13) -- 输出D
string.format("%e", 1000) -- 输出1.000000e+03
string.format("%E", 1000) -- 输出1.000000E+03
string.format("%6.3f", 13) -- 输出13.000
string.format("%q", "One\nTwo") -- 输出"One\
-- Two"
string.format("%s", "monkey") -- 输出monkey
string.format("%10s", "monkey") -- 输出 monkey
string.format("%5.3s", "monkey") -- 输出 mon
匹配用到的基本模式串 模式匹配函数 string.find, string.gmatch, string.gsub, string.match
.(点): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
[数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
[^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对
当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.例如,'%A'非字母的字符:
转义字符%
%转义字符string.find("abc%..","%%")4 4
string.find("abc..d","%.%.")4 5
用"()"进行捕获
string.find("ab12","(%d%d)")3 4 12
-表示0个或多个,匹配最少个string.find("zzxyyy","(xy-)") 3 3 x
string.find("zzzyyy","(x-y)") 4 4 y
*表示0个或多个,匹配最多个string.find("mmmnnn","(m*n)")1 4 mmmb
string.find("lllnnn","(m*n)") 4 4 n
?表示0个或1个 string.find("aaabbb","(a?b)") 3 4 ab
string.find("cccbbb","(a?b)") 4 4 b