5.字符串操作

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"

注意:

  1. 字符串库函数一般返回新字符串,不改原串。
  2. Lua 索引从 1 开始。
  3. string.findstring.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

×

喜欢就点赞,疼爱就打赏