UH2S1L3——字符串操作

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#str                --获取字符串长度
"\n" --换行字符

[[多行
字符串
]]
.. --字符串拼接
string.format() --格式化字符串
tostring() --其他类型转字符串
string.upper() --小写转大写
string.lower() --大写转小写
string.reverse() --翻转字符串
string.find() --字符串查找索引
string.sub() --截取字符串
string.rep() --重复拼接字符串
string.gsub() --字符串替换
string.byte() --字符转ASCII码
string.char() --ASCII码转字符

字符串声明

1
2
3
print("**********字符串************")
str1 = "双引号字符串"
str2 = "单引号字符串"

获取字符串长度

lua中获取字符串长度的方法是在字符串变量前加#​,这里实际返回的是该字符串有多少字节,需要注意的是,在lua里,一个中文字符占3个字节

1
2
3
4
5
6
7
print("**********字符串长度************")
s = "aBcdEfG"
print(#s)
s = "aBcdEfG字符串"
print(#s)
s = "字"
print(#s)

输出:

1
2
3
4
**********字符串长度************
7
16
3

字符串多行打印

lua中同样有转义字符,使用\n​即可换行,像使用注释那样使用[[...]]​可以编写多行字符串,类似于python的"""..."""

1
2
3
4
5
6
7
8
print("**********字符串多行打印************")
print("123\n123\n")
s = [[
这样
也可以
多行打印
]]
print(s)

输出:

1
2
3
4
5
6
7
**********字符串多行打印************
123
123

这样
也可以
多行打印

字符串拼接

lua的字符串拼接是通过..​来拼接的,如果变量类型是number​的也会转为字符串然后再拼接(boolean​和nil​类型不可以参与字符串拼接)

1
2
3
4
5
print("**********字符串拼接************")
print("123" .. "456")
s1 = "123123"
s2 = 111
print(s1 .. s2)

输出:

1
2
3
**********字符串拼接************
123456
123123111

lua也有string.format​函数在函数来生成具有特定格式的字符串
函数的第一个参数是格式 , 之后是对应格式中每个代号的各种数据,这个函数的格式很像 C 语言中的 printf()
在字符串需要内嵌的位置使用%_​字符串标记符来标记,后面跟上需要插入的内容,不同的%_​代表插入的内容不同

  • %d​:与数字拼接
  • %a​:与任何字符拼接
  • %s​:与字符配对
1
print(string.format("我是唐老狮,我今年%d岁了", 18))

输出:

1
我是唐老狮,我今年18岁了

格式字符串可能包含以下的转义码:

  • %c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
  • %d, %i - 接受一个数字并将其转化为有符号的整数格式
  • %o - 接受一个数字并将其转化为八进制数格式
  • %u - 接受一个数字并将其转化为无符号整数格式
  • %x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
  • %X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
  • %e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
  • %E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
  • %f - 接受一个数字并将其转化为浮点数格式
  • %g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
  • %q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
  • %s - 接受一个字符串并按照给定的参数格式化该字符串

为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:

  • (1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
  • (2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
  • (3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
  • (4) 宽度数值
  • (5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
1
2
3
4
5
6
7
8
9
10
11
string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- 基本字符串格式化
print(string.format("基本格式化 %s %s",string1,string2))
-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))
-- 十进制格式化
print(string.format("%.4f",1/3))

以上代码执行结果为:

1
2
3
基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

其他类型转字符串

print​函数会默认将输出的内容类型转为字符串再输出

1
2
3
print("**********其他类型转字符串************")
a = true
print(tostring(a))

输出:

1
2
**********其他类型转字符串************
true

字符串公共方法

以下方法里,作为参数传入的字符串都不会被修改,都是返回一个新字符串

1
2
print("**********字符串提供的公共方法************")
str = "aBcdEfGcd"

小写转大写

1
2
-- 小写转大写的方法
print(string.upper(str))
1
ABCDEFGCD

大写转小写

1
2
-- 大写转小写
print(string.lower(str))
1
abcdefgcd

翻转字符串

1
2
-- 翻转字符串
print(string.reverse(str))
1
dcGfEdcBa

字符串索引查找

在lua中,函数是可以有多返回值的,这个函数就是多返回值的,第二个参数传入的是一个字符串,就会返回查找到的起始索引和末尾索引

另外,在Lua中,索引从1开始数!(反程序员.jpg)

1
2
-- 字符串索引查找
print(string.find(str, "cdE"))
1
3    5

截取字符串

1
2
-- 截取字符串
print(string.sub(str, 3, 4))
1
cd

字符串重复拼接

1
2
-- 字符串重复
print(string.rep(str, 2));
1
aBcdEfGcdaBcdEfGcd

字符串修改

第二个返回值返回的是修改了几次

1
2
-- 字符串修改
print(string.gsub(str, "cd", "**"))
1
aB**EfG**    2

字符转ASCII码

第二个参数是指定哪个字符串被转为ASCII码,默认为1

1
2
3
-- 字符转ASCII码
a = string.byte("Lua", 1)
print(a)
1
76

ASCII码转字符

1
2
-- ASCII码转字符
print(string.char(a)) --a = 76
1
L