0x01:Lua字符串
- Lua语言中的字符串是一串字节组成的序列,Lua核心并不关心这些字节是以何种编码方式储存文本。
- Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串中存储任意二进制数据。
- Lua的字符串标准库默认处理8个比特位的字符,但也可以非常优雅地处理UTF-8字符串。
- 从Lua 5.3版本之后,Lua还提供了一个用于处理UTF-8编码的函数库;所以在一切条件允许的情况下,我们尽可能使用UTF-8编码。
- Lua语言中的字符串是不可变量
我们没法修改某个字符串中的某个字符,但是我们可以通过创建一个新字符串来达到修改的目的
与Lua的其他对象(表、函数等)一样,字符串是Lua自动内存管理的对象之一,Lua会负责它的分配与释放,开发人员无须关注。
- Lua字符串长度
我们可以通过长度操作符#
来获取字符串的长度
- 在某些编码中,这个值可能与字符串中的字符的个数不同
0x02:字符串常量
- 在Lua语言中可以使用一对双引号或一对单引号来声明字符串常量
同时,你也可以使用
[[ string ]]
来声明多行字符串- 在某种特殊情况下,多行字符串中可能也会包含
]]
的情况,这种情况可能会导致在]]
之后的字符都被丢弃了。
为了解决这种情况,可以在两个左括号之间添加任意数量的等号,这样Lua只有在遇到有相同数量等号的右括号时才会结束
- 在某种特殊情况下,多行字符串中可能也会包含
- Lua语言中支持下列C语言风格的转义字符
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\" 双引号
\' 单引号
- Lua字符串拼接
在Lua语言中,我们可以使用连接操作符..
将俩个字符串拼接起来
在很多语言中,字符串的拼接常用+
来进行,但是在Lua中+
与..
是不同的!
如果操作对象中含有数值,那么它会先被转换成字符串,再进行拼接
由于Lua语言中,字符串是不可变量。所以字符串拼接不会改变原来的字符串,而是创建一个新的字符串
0x03:强制类型转换
Lua语言在运行时提供了数值与字符串之间的自动转换。
- 当Lua发现在字符串操作相关的地方出现了数值,它就会先把数值转化为字符串
- 相反,当在数值操作过程中出现了字符串,则会尝试将字符串转换为数值,再进行操作
- 由于Lua 5.3并没有实现强制类型转换与整型的集成,而且算术运算规则中要求俩个值都要为整型值时,结果才会是整型值
但是字符串很明显不是整型值,所以Lua 5.3版本以上Lua 5.4以下字符串与数值的运算都是浮点运算,返回的结果只会是浮点值
- 但是在Lua 5.4之后,只要字符串中的值能被转换为整型值,则会被转为整型后再进行数值操作
- 当Lua发现在字符串操作相关的地方出现了数值,它就会先把数值转化为字符串
显式类型转换
如果我们需要显式地将一个字符串转换成数值,可以调用tonumber
函数- 当字符串中的有效数字能被转换整型数值时,则会返回整型数值,否则返回浮点数值
- 若字符串中的内容不能表示为有效数值时,则会返回
nil
- 默认情况下,函数
tonumber
使用的是十进制,但是也可以指定使用其他进制
- 当字符串中的有效数字能被转换整型数值时,则会返回整型数值,否则返回浮点数值
- 当然,可以从字符串转成数值,就可以从数值转换成字符串
调用tostring
函数可以将数值转换为字符串
0x04:字符串标准库
Lua语言解释器本身处理字符串的能力是十分有限的。它处理字符串的完整能力来自于其字符串标准库string
。
string.len(s)
返回字符串s的长度string.rep(s,n)
返回将字符串s重复n次的结果string.lower(s)
将字符串s中的字符全部转换为小写string.upper(s)
将字符串s中的字符全部转换为大写string.reverse(s)
将字符串s翻转
string.sub(s,i.j)
返回字符串s中从第i个到第j个字符;支持负索引(即从字符串的结尾开始计数)
string.char()
接收零个或多个整数作为参数,然后将每个整数转换成对应的字符,最后返回这些字符连接而成的字符串string.byte(s,i)
将字符串s的第i个字符转换成整数;当未指定第二个参数时,默认转换字符串中第一个字符
string.format
是用于进行字符串格式化和将数值输出为字符串的强大工具
该函数能将传入的字符串中存在的占位符替换成传入的对应参数,并将格式化完成后的字符串返回
string.find(s1,s2)
返回字符串s2在字符串s1中进行模式匹配,若找到则返回s2在s1中的起始位置与结束位置,否则返回nil
string.match(s1,s2)
该函数与string.find
类似,不过`string.match
返回的是匹配成功后的子串,支持正则表达式
string.gsub(s,s1,s2)
会将在模式匹配中匹配成功的子串替换为指定字符串,并返回替换完成后的字符串与替换次数
string.gmatch(s,s1)
返回一个迭代器函数,每调用一次该迭代器函数则会在字符串s中找到下一个符合的子串,并将其返回;若找不到符合的子串,则返回nil
0x05:UTF8标准库
从Lua 5.3开始,Lua语言引入了一个用于操作UTF-8编码的Unicode编码标准库。当然,在这引入这个标准库之前,Lua虽然也提供了对UTF-8字符串很好的支持。不过Lua字符串标准库中,有很多函数并不适用于UTF-8字符串,这时候就需要utf8标准库来帮忙啦。
utf8.len(s)
返回UTF-8编码的字符串s的长度
utf8.codepoint
与utf8.char
在UTF-8环境下等同于string.byte
和string.char
utf8.offset
用于将字符串中字符位置转换为字节位置
配合调用string.sub
函数我们可以将UTF-8字符串中的指定字符取出
utf8.codes
用于遍历UTF8字符串中的每一个字符
-- FILE: 10_utf8_codes.lua
s = "机智的狐狸菌"
for i, c in utf8.codes(s) do
print(i, c, utf8.char(c))
end
0x06:参考文献
- 《Lua程序设计(第4版)》
- 养眼大魔王 --- Lua之string的使用
想想你的文章写的特别好www.jiwenlaw.com