Lua中字符串库的一些操作

在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函数

string.gsub有3个参数:目标字符串、模式和替换字符串。它的基本用法就是将目标字符串中所有出现模式的地方替换为替换字符串(最后一个参数):

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+”表示匹配一个或多个字母字符序列(单词)。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值