string库概念

lua解释器对字符串支持有限,一个程序可以创建字符并连接字符串,但是不能截取子串,检查字符串的大小,内容等,操作字符串的功能基本来自string库

lua5.1中字符串库的所有函数如下

函数 描述 示例 结果
len 计算字符串长度 string.len(“abcd”) 4
rep 返回字符串s的n个拷贝 string.rep(“abcd”,2) abcdabcd
lower 返回字符串全部字母大写 string.lower(“AbcD”) abcd
upper 返回字符串全部字母小写 string.upper(“AbcD”) ABCD
format 返回一个类似printf的格式化字符串 string.format(“the value is:%d”,4) the value is:4
sub 返回i到n的字符串 string.sub(“abcd”,2) bcd
string.sub(“abcd”,-2) cd
string.sub(“abcd”,2,-2) bc
string.sub(“abcd”,2,3) bc
find 在字符串中查找 string.find(“cdcdcdcd”,”ab”) nil
string.find(“cdcdcdcd”,”cd”) 1 2
string.find(“cdcdcdcd”,”cd”,7) 7 8
gsub 在字符串中替换 string.gsub(“abcdabcd”,”a”,”z”); zbcdzbcd 2
string.gsub(“aaaa”,”a”,”z”,3); zzza 3
byte 返回字符的整数形式 string.byte(“ABCD”,4) 68
char 将整型数字转成字符并连接 string.char(97,98,99,100) abcd

String库中还可以结合基本的模式串进行应用:

【基本模式串】可以匹配一个特定字符集合内任何字符的模式项

字符类 描述 示例 结果
. 任意字符 string.find(“”,”.”) nil
%s 空白符 string.find(“ab cd”,”%s%s”) 3 4
%S 非空白符 string.find(“ab cd”,”%S%S”) 1 2
%p 标点字符 string.find(“ab,.cd”,”%p%p”) 3 4
%P 非标点字符 string.find(“ab,.cd”,”%P%P”) 1 2
%c 控制字符 string.find(“abcdtn”,”%c%c”) 5 6
%C 非控制字符 string.find(“tnabcd”,”%C%C”) 3 4
%d 数字 string.find(“abcd12”,”%d%d”) 5 6
%D 非数字 string.find(“12abcd”,”%D%D”) 3 4
%x 十六进制数字 string.find(“efgh”,”%x%x”) 1 2
%X 非十六进制数字 string.find(“efgh”,”%X%X”) 3 4
%a 字母 string.find(“AB12”,”%a%a”) 1 2
%A 非字母 string.find(“AB12”,”%A%A”) 3 4
%l 小写字母 string.find(“ABab”,”%l%l”) 3 4
%L 大写字母 string.find(“ABab”,”%L%L”) 1 2
%u 大写字母 string.find(“ABab”,”%u%u”) 1 2
%U 非大写字母 string.find(“ABab”,”%U%U”) 3 4
%w 字母和数字 string.find(“a1()”,”%w%w”) 1 2
%W 非字母和数字 string.find(“a1()”,”%W%W”) 3 4

【转义字符%】

% 转义字符 string.find(“abc%..”,”%%”) 4 4
string.find(“abc..d”,”%.%.”) 4 5

LUA中【模式修饰符】

+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次
- 匹配前一字符0次或多次
匹配前一字符0次或1次
^ 匹配目标串的开始部分
$ 匹配目标串的结尾部分

string.len

string.len(s)返回字符串s的长度

1
2
local sString = "321dlkoinmlda"
print("sString字符串的长度为:"..string.len(sString))

string.format

string.format(s,i)和C语言的printf几乎一模一样,十进制d 十六进制x 八进制o 浮点数f

1
2
3
4
5
6
pi = 3.014159625
print(string.format("pi = %.4f",pi)) --pi = 3.0142
d=5;m=11;y=1990
print(string.format("%02d/%02d/%04d"),d,m,y) -- 05/11/1990
tag,title = "hi","a title"
print(string.format("<%s>%s<%s>"),tag,title,tag) --<hi>a title<hi>

结合模式串达到最优使用

1
2
local s = "hello theee %d world~~~ %s"
print(string.format(s,100,"!!!!")) -- hello theee 100 world~~~ !!!!

string.find

string.find(s.i)查找字符串s中i字符串的对应的位置,返回的是起始和结束索引值
s:目标串
i:搜索匹配的字符串

1
2
3
4
5
6
7
8
s = "hello world"
i,j = string.find(s,"hello")
print(i,j) -- 1 5
print(string.sub(s,i,j)) -- hello(把s字符串从i到j出截取出来)
print(string.find(s,"world")) -- 7 11
i,j = string.find(s,"l")
print(i,j) --3 3
print(string.find(s,"lll")) -- nil

string.gsub

string.gsub(s,i,j)
s:目标字符(要被操作的字符串)
i:模式串(即将被替换掉的字符串)
j:替换串(新的,要替换i的字符串)
只有一个返回值,就是被替换完成后的最终字符串

1
2
3
4
5
6
s = string.gsub("Lua is cute","cute","greet")
print(s) -- Lua is great
s = string.gsub("all lii","l","x")
print(s) -- axx xii
s = stirng.gsub("Lua is greet","perl","tcl")
print(s) -- Lua is greet

可以匹配一个特定字符集合内任何字符的模式项

1
print(stirng.gsub("hello,up-down!","%A","."))     -- hello.up.down.