在Lua里面程序只能创建字符串常亮、链接字符串及获取字符串的长度。但是呢,它无法作进一步的操作,就是说,它无法提取子串或者检索字符串的内容。在Lua里面真正的字符串操作能力来自于字符串库(String)。
1.基础字符串函数
s="hello lua"
string.len(s) --返回字符串的长度
string.rep(s) --返回字符串重复n次的结果
s:rep(n) --返回字符串重复n次的结果
例如,可以用string.rep(“a”,2^20)来创建一个1MB的字符串。
string.lower(s) --可返回一份s的副本,其中大写字母都被转为小写字母,其他不变
string.upper(s) --和上面的相反
大小写转换函数有一个经典的用途,假设需要对一个字符串数组进行排序,并且不区分大小写。
string.sub(s, i[,j])
string.sub(s,i,j) --可以从字符串s中提取第i个到第j个字符(第一个字符的索引是0)
在Lua中字符串的第一个字符的索引是1.还可以用负数索引,这样就会从字符串的尾部开始计数,索引-1代表最后一个字符,-2代表倒数第二个字符。
s:sub(1,j)
string.sub(s,1,j) --获取字符串s的前j个字符
s:sub(j) --第二个参数默认为-1
string.sub(s,j,-1)--获取从s的第j个字符开始到最后的字符串
string.sub(s,2,-2)--去掉s的前一个和最后一个字符并返回
记住,Lua中的字符串是不可变的。和Lua中的所有其他函数一样,string.sub不会改变字符串的值,它只会返回一个新的字符串。
函数string.char和string.byte用于转换字符及其内部数值表示。string.char函数接受0个或多个整数,并将每个整数转换成对应的字符,然后返回一个由这些字符链接而成的字符串。string.byte(s,i)返回字符串s中第i个字符的内部数值表示,它的第二个参数是可选的,调用string.byte(s)可返回字符串s中第一个字符的内部数值表示。
print(string.char(97)) --> a
i=99; print(string.char(i,i+1,i+2)) --> cde
print(string.byte("abc")) --> 97
print(string.byte("abc",2)) --> 98
print(string.byte("abc",-1)) --> 99
在lua5.1中,string.byte还可以接受可选的第三个参数。调用string.byte(s,i,j)可以返回索引i到j之间(包括i,j)的所有字符的内部表示。(没有第三个参数时,默认j=i)!!!这个特性Lua很多地方都用到了!!!
函数string.format是用于格式化字符串的利器,经常用在输出上。它会根据第一个参数的描述,返回后续其他参数的格式化版本,这第一个参数也称为“格式化字符串”。编写格式化字符串的规则与C语言中printf等函数的规则基本相同:一个指示器字符‘%’加上一个字母组成,d用于十进制、x用于十六进制、o用于八进制、f用于浮点数、s用于字符串等。在百分号和字母之间可以在指定一些其他选项,用于控制格式的细节:
print(string.string.format("pi=%.4f", math.pi)) -->pi=3.1416
d=5;m=11;y=1990
print(string.format("%02d/%02d/%04d",d,m,y)) -->05/11/1990
tag,title="hi","atitle"
print(string.format("<%s>%s</%s>",tag,title,tag)) --><h1>atitle</hi>
在第一次打印中,%.4f表示一个浮点数的小数点后有4个数字。在第二次打印中,%02d表示一个十进制数至少有两个数字,不足的话用0补上,而%2d则表示用空格来补足。
2.模式匹配(pattern-matching)函数
字符串库中最强大的函数是find、match、gsub(global substitution,全局替换)和gmatch(global match,全局匹配),他们都是基于模式的。
2.1 string.find函数
string.find函数用于在一个给定的目标字符串中寻找一个模式。最简单的方式就是返回一个单词:
s="hello world"
i,j=string.fill(s, "hello")
print(i,j) -->1 5
print(string.sub(s,i,j)) -->hello
print(string.find(s,"world")) -->7 11
i,j=string.find(s,"l")
print(i,j) -->3 3
print(string.fill(s, "lll")) -->nil
string.find函数还具有一个可选的第三个参数,它是一个索引,告诉函数应该从目标字符串的哪一个位置开始搜索。当处理所有与给定模式相匹配的部分时,这个参数就很有作用。可以重复搜索新的匹配,并且每次搜索都从上一次找到的位置开始:
local t={} --存储索引的table
local i=0
while true do
i=string.find(s,"\n",i+1) --查找下一个换行符
if i=nil then break end
t[#t+1]=i
end
2.2 string.match函数
string.find和string.match非常相似,不一样的地方是,string.match返回的是目标字符串与模式中相匹配的那部分子串,而非该模式所在的位置。
print(string.match("hello world","hello")) -->hello
2.3 string.gsub函数
s=string.gsub("Lua is cute","cute","greate")
print(s) -->Lua is greate
s=string.gsub("all lii","l","x")
print(s) -->axx xii
s=string.gsub("Lua is great","Sol","Sun")
print(s) -->Lua is great
--另外还有第四个可选参数,可以限制替换的次数:
s=string.gsub("all lii","l","x",1)
print(s) -->axl lii
s=string.gsub("all lii","l","x",2)
print(s) -->axx lii
函数string.gsub还有另一个结果,即实际替换的次数。例如,以下代码就是一种统计字符串中空格数量的简单方法:
cout=select(2,string.gsub(str," "," "))
2.4 string.gmatch函数
这个是返回所有目标字符串中符合规范的字符串,“%a+”表示匹配一个或多个字母字符序列(单词)。