5.字符串操作
5.1 知识点
知识回顾
- 声明字符串
str1 = "双引号字符串"
str2 = '单引号字符串'
#获取字符串长度
#取的是字节长度,不是字符个数。Lua 字符串是一段字节序列。- 英文、数字一般 1 字节,UTF-8 中文一般 3 字节。
str1 = "aBcdEfG字符串"
print(#str1) -- 16
不要把 # 当中文字符计数工具;按字符数处理中文要看编码和项目里的字符串工具怎么处理的。
字符串多行打印
- Lua 支持转义字符换行来多行打印。
print("123\n123")
输出:
123
123
- 也可以用
[[]]包裹字符串多行打印。
str1 = [[
我是
韬
]]
print(str1)
输出:
我是
韬
[[]] 写大段文本、配置片段、调试输出时可以更方便一点,因为不用一直写 \n。
..和string.format方法进行字符串拼接
..做字符串拼接。
print("123" .. "456") -- 123456
str1 = 111
str2 = 222
print(str1 .. str2) -- 111222
string.format用占位符格式化:%d整数、%f小数、%s字符串。
print(string.format("我是韬老狮,我今年%d岁了", 18))
.. 适合简单拼接;格式固定、参数多时可以选择用 string.format。
tostring方法让别的类型转字符串
tostring把其他类型转成字符串。
a = true
print(tostring(a)) -- true
拼接前变量可能为 nil 时,先 tostring,避免报错。
字符串库函数
拿 str1 作为例子:
str1 = "abCdefgCd"
注意:
- 字符串库函数一般返回新字符串,不改原串。
- Lua 索引从 1 开始。
string.find、string.gsub默认按 Lua 匹配规则;遇到.、+、%等特殊字符要注意。
小写转大写方法string.upper 传入字符串
print(string.upper(str1)) -- ABCDEFGCD
大写转小写方法string.lower 传入字符串
print(string.lower(str1)) -- abcdefgcd
翻转字符串方法string.reverse 传入字符串
print(string.reverse(str1)) -- dCgfedCba
普通英文字符串没问题;UTF-8 中文按字节反转容易乱码。
字符串索引查找方法string.find 传入字符串和要查找的字符串 会返回起始和结束索引
print(string.find(str1, "Cde")) -- 3 5
string.find 第二个参数默认按 Lua 匹配规则理解。. 表示任意字符,查真正的点号要用 %. 或第四个参数 true 按普通文本查。
local str3 = "abc.def"
print(string.find(str3, ".")) -- 1 1,"." 在匹配规则里表示任意字符
print(string.find(str3, "%.")) -- 4 4,用 "%." 查真正的点号
print(string.find(str3, ".", 1, true)) -- 4 4,第四个参数 true 表示按普通文本查找
截取字符串方法string.sub 传入字符串和起始结束索引 不传结束索引默认到传入的字符串尾
print(string.sub(str1, 3)) -- CdefgCd
print(string.sub(str1, 3, 4)) -- Cd
字符串重复方法string.rep 传入字符串和重复次数
print(string.rep(str1, 2)) -- abCdefgCdabCdefgCd
字符串修改方法string.gsub 传入要修改的字符和替换后的字符 返回修改后的字符串和修改了几处
print(string.gsub(str1, "Cd", "**")) -- ab**efg** 2
string.gsub 同样按匹配规则。返回两个值:新字符串、替换次数。
字符转字节值方法string.byte 传入字符串和要转字节值的字符索引
str1 = string.byte("Lua", 1) -- 转换 L 为字节值
print(str1) -- 76
string.byte 拿到的是字节值;英文字符串上可以理解为转成 ASCII 码的字节值。
字节值转字符方法string.char 传入字节值
print(string.char(str1)) -- L
5.2 知识点代码
Lesson5_字符串操作.lua
print("**********字符串操作************")
print("**********知识回顾************")
-- 声明字符串
str1 = "双引号字符串"
str2 = '单引号字符串'
print("**********知识点一 获取字符串长度************")
str1 = "aBcdEfG字符串"
-- # 取字节长度,不是字符个数;UTF-8 中文一般 3 字节,英文 1 字节
print(#str1) -- 16
print("**********知识点二 字符串多行打印************")
-- 转义 \n 换行
print("123\n123")
-- 123
-- 123
-- [[]] 多行字符串,写大段文本省事
str1 = [[
我是
韬
]]
print(str1)
-- 我是
-- 韬
print("**********知识点三 字符串拼接************")
-- .. 简单拼接
print("123" .. "456") -- 123456
str1 = 111
str2 = 222
print(str1 .. str2) -- 111222
-- string.format:%d 整数、%f 小数、%s 字符串
print(string.format("我是韬老狮,我今年%d岁了", 18))
print("**********知识点四 别的类型转字符串************")
-- tostring 转字符串;可能 nil 时先 tostring 再拼接
a = true
print(tostring(a)) -- true
print("**********知识点五 字符串库函数************")
str1 = "abCdefgCd"
-- 1. 一般返回新字符串,不改原串
-- 2. 索引从 1 开始
-- 3. find/gsub 默认按匹配规则;遇 .、+、% 要注意
print(string.upper(str1)) -- ABCDEFGCD
print(string.lower(str1)) -- abcdefgcd
-- UTF-8 中文按字节反转容易乱码
print(string.reverse(str1)) -- dCgfedCba
print(string.find(str1, "Cde")) -- 3 5
-- find 默认按匹配规则;. 表任意字符,查点号用 %. 或第 4 参 true
local str3 = "abc.def"
print(string.find(str3, ".")) -- 1 1,"." 在匹配规则里表示任意字符
print(string.find(str3, "%.")) -- 4 4,用 "%." 查真正的点号
print(string.find(str3, ".", 1, true)) -- 4 4,第四个参数 true 表示按普通文本查找
print(string.sub(str1, 3)) -- CdefgCd
print(string.sub(str1, 3, 4)) -- Cd
print(string.rep(str1, 2)) -- abCdefgCdabCdefgCd
-- gsub 返回新字符串和替换次数
print(string.gsub(str1, "Cd", "**")) -- ab**efg** 2
-- string.byte 取字节值;英文可当 ASCII
str1 = string.byte("Lua", 1) -- 转换 L 为字节值
print(str1) -- 76
print(string.char(str1)) -- L
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com