L03-04. String类型
一. 字符串介绍
1. Lua 语言中的字符串即可以表示单个字符,也可以表示一整本书籍。在Lua语言中,操作 100K 或者 1M 个字母组成的字符串的程序很常见
2. 当字符串内容中存在用来表示字符串的符号时,可以3种表示方式灵活应用解决
--使用单引号或双引号来表示字符串 local a = "我是双引号字符串" local b = '我是单引号字符串' --使用[[]]来表示字符串或长文本内容 local c = [[我是中括号字符串]] local d = [[ 1. 我是长文本字符串1 2. 我是长文本字符串2 3. 我是长文本字符串3 ]] local d = [=[ 1. 我是长文本字符串1 2. 我是长文本字符串2 3. 我是长文本字符串3]] ]=]
3. 字符串连接使用".."进行, ".." 只能连接字符串和数字
--在连接数字时,与数字中间一定要有空格,不然认为是小数点然后报错 print("我" .. nil) --报错 print("我" .. "你") --输出结果: 我你
4. 可以使用长度操作符(#)来获取字符串的长度
print(#{1,2,3,4}) --输出结果: 4 print(#"我") --输出结果: 3 汉字在lua中占有3个字节 print(#"123456") --输出结果: 6
5. 字符串中的转义字符(下面只是其中一部分)
① 也可以使用"\"+数值的转义来表示字符, 数值最多由3位数组成
print("\10") --表示换号与\n一样 print("\97\1001") --输出结果: ad1 print("\65\66\100") --输出结果: ABd
② 在字符串中转义十六进制数值表示的字符"\"+两个十六进制数,十六进制数值必须由两个且必须是两个十六进制数字组成
print("\x41") --输出结果: A --在ascll编码的系统中下面的两个表达式是等价的 print("ALO\n123\"") print('\x41LO\10\04923"') --把上述字符串全部改为十六进制,来表示字符串中的每一个字符 print('\x41\x4c\x4f\x0a\x31\x32\x33\x22')
③ 可以使用转义序列\u{h...h}来声明UTF-8字符,花括号中可以支持任意有效的十六进制
print("\u{3b1} \u{3b2} \u{6211}") --输出结果: α β 我
④ 在表示多行[[ ]]的字符串中转义序列不会被转义
⑤\z转义字符,会跳过其后的所有空白字符,直到遇到第一个非空白字符(一行字符串分成两行写)
--下面的代码是换行(一行内容分成两行写但是代码中的效果是一行) data2 = "\65\z 123" print(data2) --输出结果: A123(中间不会有换行符)
二. 字符串标准库
字符串标准库默认处理的是1字节8bit的字符(数值为0~255之间)。这对于某些编码方式(例如ASCII或ISO-8859-1)适用,但对所有的Unicode编码来说都不适用
ascll百度百科:https://baike.baidu.com/item/ASCII/309296?fr=aladdin#7
1. 字符串与Ascll互转
① string.byte(str[,statr[,end]]): 字符串转Ascll码列表
②string.char(...): Ascll码列表转字符串
--[=[ string.byte(s[,i[,j]])将字符串转为Ascll列表 语法: string.byte(s[,i[,j]]) 功能: 将字符串转为Ascll列表 参数: 参数s(必选): 待转字符串 参数i(可选): 开始获取位置(在第几个字符开始获取) -5表示在倒数第5个字符开始获取 参数j(可选): 结束获取位置(在第几个字符结束获取) -1表示在倒数第1个字符结束获取 返回值: list(ascll列表) --]=] --[=[ string.char(...)将Ascll列表转为可以标识为字符的字符串 语法: string.char(...) 功能: 将Ascll列表转为可以标识为字符的字符串 参数: 参数(可变长参数): 待转Ascll码= 返回值: 字符串型, 可以标识为字符的字符串 --]=] --string.byte local str = "hello" --默认开始位置默认"1",结束位置默认"i" print( string.byte(str) ) --输出结果: 104 print( string.byte(str, 2) ) --输出结果: 101 --也支持负数索引 print( string.byte(str, 2,-1) ) --输出结果: 101 108 108 111 print( string.byte(str, -3,-1) ) --输出结果: 108 108 111 --string.char local t = {65,66,67,68} print(string.char(table.unpack(t))) ----这俩函数配合可以编写随机字母、循环输出字母等 --[[ 将字符串中的每个字符转换为表 由于Lua语言限制了栈大小,所以也限制了一个函数的返回值的最大个数,默认最大为一百万个。 因此,这个技巧不能用于大小超过1MB的字符串 --]] str = "hello" t = {str:byte(str,1,-1)}
③ string.byte(char) > 127则代表是中文, string.byte(char) <=127则代表是普通字符
--汉字转ascll str = "我" print(string.byte(str,1,-1)) --将汉字Ascll码转回汉字 print("\230\136\145") print(string.char(230,136,145))
④ string.sub(str,i,[,j]) : 截取字符串
--[=[ string.sub(str[,start_i[,end_j]]): 截取字符串 语法: string.byte(s[,i[,j]]) 功能: 截取指定开始位置,结束位置的字符串 参数: 参数s(必选): 待截取的字符串 参数i(可选): 开始截取的位置,负数索引超过长度修正为1,省略默认也是1 参数j(可选): 结束截取的位置,正数索引超过长度修正为-1,省略默认也是-1 返回值: list(ascll列表) --]=] --开始截取位置负数索引超过长度修正为1 --结束截取位置整数索引超过长度修正为-1 print(string.sub("ABCDEFG",-999,999)) --输出结果: ABCDEFG --结束截取位置省略则默认为-1 print(string.sub("ABCDEFG",1)) --输出结果: ABCDEFG print(string.sub("ABCDEFG",5,-1)) --输出结果: EFG --超过长度返回长度为0的空值---"" print(string.sub("ABCDEFG",999,999)) --输出结果: "" --开始截取位置大于结束截取位置返回长度为0的空值---"" print(string.sub("ABCDEFG",8,5)) --输出结果: ""
⑤获取字符串长度与"#"号功能一样
--获取字符串长度与"#"号功能一样 print( string.len(123456) ) --输出结果: 6 print( string.len("你我他") ) --输出结果: 9
⑥大小写互转
--转小写字母 print( string.lower("ABCDEFGHIJKLMN") ) --输出结果: abcdefghijklmn --转大写字母 print( string.upper("abcdefghijklmn") ) --输出结果: ABCDEFGHIJKLMN
⑦字符串反转
--字符串反转 print( string.reverse("zimaoxueyuan") ) --输出结果: nauyeuxoamiz print( string.reverse("我是一个兵") ) --错误,输出结果
⑧生成重复字符串
--[[ string.rep (s, n [, sep]) : 重复生成指定个数的字符串 语法: string.rep (s, n [, sep]) 功能: 重复生成指定个数的字符串 参数: 参数s(必选): 要重复生成的字符串 参数n(可选): 生成多少个重复字符串 参数sep(可选): 每个重复的字符串直接的分隔符 返回值: 字符串型, 重复生成的字符串 --]] print( string.rep ("A", 10 ,",") ) --一般用于对齐时候加空格使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了