详解string库
string.sub
接下来几节会讲解string库的各种接口
string.sub(s, i [, j])
返回字符串 s 中,从索引i到索引 j 之间的子字符串。
i 可以为负数,表示倒数第几个字符。
当 j 缺省时,默认为 -1,也就是字符串 s 的最后位置。
当索引 i 在字符串 s 的位置在索引 j 的后面时,将返回一个空字符串。
下面是例子:
print(string.sub(“Hello Lua”, 4, 7))
print(string.sub(“Hello Lua”, 2))
print(string.sub(“Hello Lua”, 2, 1))
print(string.sub(“Hello Lua”, -3, -1))
–>打印的结果:
lo L
ello Lua
Lua
值得注意的是,我们可以使用冒号来简化语法,像下面这样:
s = “12345”
s1 = string.sub(s, 4, 7)
s2 = s:sub(4, 7)
–两种写法是等价关系
print(s1,s2)
请完成下面的任务:
已知字符串变量s,请分别打印出(每种一行):
s从第4个字符开始,到最后的值
s从第1个字符开始,到倒数第3个字符的值
s从倒数第5个字符开始,到倒数第2个字符的值
s = “1919810”
–补全代码
print()
print()
print()
string.rep
string.rep(s, n)
返回字符串 s 的 n 次拷贝。
示例代码:
print(string.rep(“abc”, 3))
–输出结果:
–abcabcabc
请完成下面的任务:
打印一行数据,数据内容为810个114514
–补全代码
print()
string.len
string.len(s)
接收一个字符串,返回它的长度。
示例代码:
s = “hello lua”
print(string.len(s))
–输出结果:
9
–同时也可以使用简便语法
print(s:len())
请完成下面的任务:
新建一个变量s,使数据内容为810个114514
并打印出字符串s的长度
s = --补全代码
print()
大小写转换
string.lower(s)
接收一个字符串 s,返回一个把所有大写字母变成小写字母的字符串。
string.upper(s)
接收一个字符串 s,返回一个把所有小写字母变成大写字母的字符串。
示例代码:
s = “hello lua”
print(string.upper(s))
print(string.lower(s))
–输出结果:
HELLO LUA
hello lua
–同时也可以使用简便语法
print(s:upper())
print(s:lower())
请完成下面的任务:
已知一个变量s,打印出全是大写字母的s字符串
s = “asd8938KJjsidiajdl;(()k)”
print --补全代码
string.format
string.format(formatstring, …)
按照格式化参数formatstring,返回后面…内容的格式化版本。
编写格式化字符串的规则与标准 c 语言中 printf 函数的规则基本相同:
它由常规文本和指示组成,这些指示控制了每个参数应放到格式化结果的什么位置,及如何放入它们。
一个指示由字符%加上一个字母组成,这些字母指定了如何格式化参数,例如d用于十进制数、x用于十六进制数、o用于八进制数、f用于浮点数、s用于字符串等。
示例代码:
print(string.format(“%.4f”, 3.1415926)) – 保留4位小数
print(string.format(“%d %x %o”, 31, 31, 31))-- 十进制数31转换成不同进制
d,m,y = 29,7,2015
print(string.format(“%s %02d/%02d/%d”, “today is:”, d, m, y))
–控制输出2位数字,并在前面补0
–>输出
– 3.1416
– 31 1f 37
– today is: 29/07/2015
请完成下面的任务:
已知一个变量n,为number类型整数
打印出n:连上n值的字符串
n = 810
print --补全代码
string的本质
这一节我们来讲解字符串的本质
字符串,是用来存储一串字符的,但是它的本质就是一串数字。如何也一串数字来代表一串字符呢?
在计算机中,每一个符号都对应着一个数字,但是在讲解这个知识之前,我们了解一下补充知识:
在大多数编程语言中,我们使用0x开头来表示这个数字是16进制的。
比如
10等价于0x0a
256等价于0xff
接下来,你需要了解,每一个符号都对应着一个数字,比如:
0对应着0x30、1对应着0x31
a对应着0x61、b对应着0x62
A对应着0x41、B对应着0x42
上面的编码规则,我们称之为ascii码,具体想了解可以打开下面的网址查看:
http://ascii.911cha.com/ 当然,1字节最大为0xff,即256,只能存下一部分符号,大部分的中文按某些编码,一个中文占用2或3个字节
计算机如何解析这些数据,我们不需要了解,当你知道了上面的知识后,你应该可以理解下面的描述:
字符串"apple"实际上的内容就是下面的一串数字:
0x61,0x70,0x70,0x6c,0x65
同时,lua的字符串中可以保存任何数值,即使是0x00这种不代表任何含义的数,也可以保存
补充:在其他语言中(如C),0x00代表字符串结束,但是在lua中并不是这样。
lua的字符串每字节可以存储任意的一字节数据。
7.string.char
string.char (…)
接收 0 个或更多的整数(整数范围:0~255),返回这些整数所对应的 ASCII 码字符组成的字符串。当参数为空时,默认是一个 0。
如果上一章节有认真学习过了的话,这段话应该是很好理解的。实质上就是把计算机认识的一串数字,变成字符串变量,并且字符串内的数据就是要存的那串数据。
示例代码:
str1 = string.char(0x30,0x31,0x32,0x33)
str2 = string.char(0x01,0x02,0x30,0x03,0x44)
print(str1)
print(str2)
–>输出(不可见字符用�代替)
–0123
–��0�D
请完成下面的任务:
已知一个字符串的每个字符在数组t中按顺序排列
请根据t的值,打印出字符串内容(一行数据)
注:这个字符串存储的不一定是可见的字符
t = {0x79,0x6F,0x75,0x20,0x61,0x72,0x65,0x20,0x72,0x69,0x67,0x68,0x74}
print(“真正的字符串内容:”)
–补全代码
8.string.byte
string.byte(s [, i [, j ] ])
返回字符 s[i]、s[i + 1]、s[i + 2]、······、s[j] 所对应的 ASCII 码。i 的默认值为 1,即第一个字节,j 的默认值为 i 。
这个函数功能刚好和前面的string.char相反,是提取字符串中实际的数值。
示例代码:
str = “12345”
print(string.byte(str,2))
print(str:byte(2))–也可以这样
print(str:byte())–不填默认是1
–>输出(十进制数据)
–50
–50
–49
请完成下面的任务:
已知字符串s
请把s中代表的数据,全部相加,并打印出来
s = string.char(1,2,3,4,5,6,7,8,9)
print(“s内数据的和是:”)
–补全代码
9.string.find
string.find(s, p [, init [, plain] ])
这个函数会在字符串s中,寻找匹配p字符串的数据。如果成功找到,那么会返回p字符串在s字符串中出现的开始位置和结束位置;如果没找到,那么就返回nil。
第三个参数init默认为1,表示从第几个字符开始匹配,当init为负数时,表示从s字符串的倒数第-init个字符处开始匹配。
第四个参数plain默认为false,当其为true时,只会把p看成一个字符串对待。
可能你会奇怪,第四个参数有什么存在的必要吗?p不是本来就应该是个字符串吗?
实际上,lua中的匹配默认意义是正则匹配,同时,这里的正则与其它语言也有些许不同。
由于篇幅有限,本节和下面的几节涉及匹配内容时,均不会考虑正则的使用方法,Lua正则教程将会在最后几节单独详细地列出来。
第四个参数为true时,便不会使用正则功能。
示例代码:
–只会匹配到第一个
print(string.find(“abc abc”, “ab”))
– 从索引为2的位置开始匹配字符串:ab
print(string.find(“abc abc”, “ab”, 2))
– 从索引为5的位置开始匹配字符串:ab
print(string.find(“abc abc”, “ab”, -3))
–>输出
–1 2
–5 6
–5 6
请完成下面的任务:
已知字符串s,里面有很多相同的字符串
请找出字符串s中,所有字符串awsl的位置
使用print打印结果,结果一行一个
如字符串12awslawslaw,输出3和7
s = “12awsaslwlaawsllslllswasllalssawwlawslaw”
print(“两个awsl的位置分别是:”)
–补全代码
10.string.gsub
string.gsub(s, p, r [, n])
将目标字符串s中所有的子串p替换成字符串r。
可选参数n,表示限制替换次数。
返回值有两个,第一个是被替换后的字符串,第二个是替换了多少次。
特别提示:这个函数的目标字符串s,也是支持正则的
下面是例子:
print(string.gsub(“Lua Lua Lua”, “Lua”, “hello”))
print(string.gsub(“Lua Lua Lua”, “Lua”, “hello”, 2)) --指明第四个参数
–>打印的结果:
– hello hello hello 3
– hello hello Lua 2
同样的,我们也可以使用冒号来简化语法,像下面这样:
s = “12345”
r = s:gsub(“2”,“b”)
print®
请完成下面的任务:
已知字符串变量s,请分别打印出(每种一行):
把字符串s中,前5个a,替换为b
把字符串s中,前3个c,替换为xxx
把结果打印出来,一行数据
s = “asdicagydausckfugdaflgscdabgsdbahhacbshbsd”
print(“s变换前的值:”,s)
–补全代码