1.
string.len(s):返回字符串的长度
string.rep(s,n):返回重复n次字符串s的串,如你使用string.rep("a",2^20)可以创建一个1M bytes的字符串
string.upper(s):将小写转换为大写
string.lower(s):将大写转换为小写
string.char(s):将数字转为字符,获取0个或多个整数
string.byte(s,i):将字符串s的第i个字符转换成整数,第二个参数是可选的
string.format(s):用来对字符串进行格式化,特别是字符串的输出
PI=3.1416394894737293
print(string.format("pi=%.4f",PI))
------>>pi=3.1416
d=5;m=11;y=1990
print(string.format("%02d/%02d/%04d",d,m,y))
------->>05/11/1990
tag,title="h1","a title"
print(string.format("<%s>%s</%s>",tag,title,tag))
-------->>><h1>a title</h1>
2.
string.sub(s,i,j):从第i个字符到第j个字符之间的串。字符串的第一个字符索引从1开始;若使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数的第二个,以此类推
s="[in brackets]"
print(string.sub(s,2,-2))
结果:in brackets
s="[in brackets]"
print(string.sub(s,2,-1))
结果:in brackets]
s="[in brackets]"
print(string.sub(s,1,-1))
结果:[in brackets]
s="[in brackets]"
print(string.sub(s,1,1))
结果:[
s="[in brackets]"
print(string.sub(s,1,2))
结果:[i
3.模式匹配
在string库中功能最强大的函数是:string.find(字符串查找),string.gsub(全局字符串替换),and string.gfind(全局字符串查找)。这些函数都是基于模式匹配的。
string.gsub的第二个返回值表示他进行替换操作的次数。例如,下面代码涌来计算一个字符串中空格出现的次数:
_, count = string.gsub(str, " ", " ")
(注意,_ 只是一个哑元变量)
4.模式
下面的表列出了Lua支持的所有字符类:
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
(1)
上面字符类的大写形式表示小写所代表的集合的补集。例如,'%A'非字母的字符:
print(string.gsub("hello, up-down!", "%A", "."))
--> hello..up.down. 4
(数字4不是字符串结果的一部分,他是gsub返回的第二个结果,代表发生替换的次数。下面其他的关于打印gsub结果的例子中将会忽略这个数值。)在模式匹配中有一些特殊字符,他们有特殊的意义,Lua中的特殊字符如下:
( ) . % + - * ? [ ^ $
'%' 用作特殊字符的转义字符,因此 '%.' 匹配点;'%%' 匹配字符 '%'。转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。
(2).
'\' 是Lua的转义符。
(3).
'[%w_]' 将匹配字母数字和下划线,'[01]' 匹配二进制数字,'[%[%]]' 匹配一对方括号。下面的例子统计文本中元音字母出现的次数:
_, nvow = string.gsub(text, "[AEIOUaeiou]", "")
print(_,count)
------>>hll wrld, lv y 8
(4).
'%d' 表示 '[0-9]';'%x' 表示'[0-9a-fA-F]'。然而,如果你想查找八进制数,你可能更喜欢使用 '[0-7]' 而不是'[01234567]'。你可以在字符集(char-set)的开始处使用 '^' 表示其补集:'[^0-7]' 匹配任何不是八进制数字的字符;'[^\n]' 匹配任何非换行符户的字符。记住,可以使用大写的字符类表示其补集:'%S' 比 '[^%s]' 要简短些。
(5).
可以使用修饰符来修饰模式增强模式的表达能力,Lua中的模式修饰符有四个:
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次
- 匹配前一字符0次或多次
? 匹配前一字符0次或1次
'+',匹配一个或多个字符,总是进行最长的匹配。
'*' 与 '+' 类似,但是他匹配一个字符0次或多次出现.一个典型的应用是匹配空白。
'-' 与 '*' 一样,都匹配一个字符的0次或多次出现,但是他进行的是最短匹配。
i,j=string.find("the number 1298 is even","%d+")
print(i,j)
------>>>12 15(从第12位开始,第15位结束)
如果你使用模式'[_%a][_%w]-' 来查找标示符,你将只能找到第一个字母,因为 '[_%w]-' 永远匹配空。另一方面,假定你想查找C程序中的注释,很多人可能使用 '/%*.*%*/'(也就是说 "/*" 后面跟着任意多个字符,然后跟着 "*/" )。然而,由于 '.*' 进行的是最长匹配,这个模式将匹配程序中第一个 "/*" 和最后一个 "*/" 之间所有部分:
test = "int x; /* x */ int y; /* y */"
print(string.gsub(test, "/%*.*%*/", "<COMMENT>"))
--> int x; <COMMENT>
然而模式 '.-' 进行的是最短匹配,她会匹配 "/*" 开始到第一个 "*/" 之前的部分:
test = "int x; /* x */ int y; /* y */"
print(string.gsub(test, "/%*.-%*/", "<COMMENT>"))
--> int x; <COMMENT> int y; <COMMENT>
'?' 匹配一个字符0次或1次。举个例子,假定我们想在一段文本内查找一个整数,整数可能带有正负号。模式 '[+-]?%d+' 符合我们的要求,它可以匹配像 "-12"、"23" 和"+1009" 等数字。'[+-]' 是一个匹配 '+' 或者 '-' 的字符类;接下来的 '?' 意思是匹配前面的字符类0次或者1次。
以 '^' 开头的模式只匹配目标串的开始部分,相似的,以 '$' 结尾的模式只匹配目标串的结尾部分。这不仅可以用来限制你要查找的模式,还可以定位(anchor)模式。比如:
if string.find(s, "^%d") then ...
检查字符串s是否以数字开头,而
if string.find(s, "^[+-]?%d+$") then ...
检查字符串s是否是一个整数。
'%b' 用来匹配对称的字符。常写为 '%bxy' ,x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。比如,'%b()' 匹配以 '(' 开始,以 ')' 结束的字符串:
print(string.gsub("a (enclosed (in) parentheses) line",
"%b()", ""))
--> a line
常用的这种模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字符作为分隔符。