当前位置: 首页 > 工具软件 > Lua VM > 使用案例 >

字符串 - string(Lua)

越骏俊
2023-12-01

字符串

string 是 Lua 中八大数据类型之一,Lua 中没有字符的概念,所有的文本都是 string。Lua 中的string 是以 8个比特 来储存的。

Lua中的字符串与大多数语言字符串一样都是不可变量。所有改变string的操作,都是生成新的string。Lua中string数据结构使用的是哈希算法实现的字符串池。这样的做法是为了保证内存不泄露,且字符串比较时大大提高性能。


表示方法
string有两种表示方法

  • ’ 单引号 如 's'
  • " 双引号 如 "s"

它们都是表示字符串常量的方式,建议使用一种即可,不要混用。


长字符串
string可以使用 [[ ]]这样的方式来表示多行长字符串的书写

local s = [[
L
u
a]]

转义字符

转义字符意义ASCII码值(十进制)
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前一列008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF) ,将当前位置移到下一行开头010
\r回车(CR) ,将当前位置移到本行开头013
\t水平制表(HT) (跳到下一个TAB位置)009
\v垂直制表(VT)011
\代表一个反斜线字符’‘’092
代表一个单引号(撇号)字符039
"代表一个双引号字符034
\0空字符(NULL)000
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh1到2位十六进制所代表的任意字符二位十六进制

常用函数(字符串标准库)

..: 链接两个字符串(相当于其他语言中的 + 符号,连接两种字符串从而生成新的字符串)

string.upper: 字符串全部转为大写字母
string.lower: 字符串全部转为小写字母

string.gusb: 在字符串中替换

string.reverse: 字符串反转

string.find: 查找子串,返回这个子串的起始索引和结束索引(可以使用模式匹配)

string:rep: 返回字符串string的n个拷贝

string.char: char 将整型数字转成字符并连接
string.byte: byte 转换字符为整数值

string.len: 计算字符串长度(也可以使用 #)

string.sub: 截取字符串

string.gmatch: 返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。(模式匹配)

string.match: 只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。(模式匹配)

Lua中的字符串模式匹配是支持正则表达式(不完全支持)。具体看官方文档

具体的使用可以看官方文档


UTF - 8编码
Lua是支持UTF-8的,还提供了一些处理的库函数(Lua5.3)。

local s = "Lua语言"

--我们需要截取后面的两个中文汉字,方法如下
local s1 = s:sub(utf8.offset(s, -2) --语言

--获得UTF-8编码长度
local len = utf8.len(s) --5

--遍历UTF-8编码字符串中的字符
for p, c in utf8.codes(s) do --p是在字符串s的位置, c是utf8编码的字符编码(可以转换)
	print(utf8.char(c))
end

Lua还提供的utf8.charutf8.codepoint 两种处理函数字符编码转换为字符串和字符串转换为数字
这与string的string.charstring.byte类似


强制类型转换

在使用算术运算符时,如果操作的是字符串,Lua会尝试将string类型变为浮点数

print("2" * 2) --4.0
print("2" * "2") --4.0

同理,使用的是字符串连接符..,如果操作的是number,Lua会尝试将number类型将转换为字符串

print("20" .. 22) --2022
print(20 .. 22) --2022

谢谢大家观看

 类似资料: