详解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)


–补全代码