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 ,",") )
--一般用于对齐时候加空格使用
复制代码

 

posted @   小书臣  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示