| 函数 | 说明 |
|---|---|
| string.byte) | 读取字节(字符的编码) |
| string.char) | 由编码生成字符串 |
| string.dump) | 将函数编译成二进制块 |
| string.find) | 字符串搜索 |
| string.format) | 格式化生成字符串 |
| string.gmatch) | 字符串全局匹配 |
| string.gsub) | 字符串全局替换 |
| string.len) | 获取字符串长度 |
| string.lower) | 字符串转小写 |
| string.match) | 字符串匹配 |
| string.pack) | 格式化生成二进制字符串 |
| string.packsize) | 获取格式化二进制字符串的长度 |
| string.rep) | 重复字符串 |
| string.reverse) | 反转字符串 |
| string.sub) | 提取子字符串 |
| string.unpack) | 从二进制字符串中解包数据 |
| string.upper) | 字符串转大写 |
string.byte (s [, i [, j]])
!subtitle:说明
从字符串中读取多个字节:s[i], s[i+1], ..., s[j]。
索引可以为负数,从字符串末尾向前索引,最后一个字符位的索引为 -1。
!subtitle:参数
s - 要读取的字符串
i - 要读取的第一个字节索引;默认为 1
j - 要读取的最后一个字节索引;默认为 i
!subtitle:返回值
返回字符的整数编码 s[i], s[i+1], ..., s[j]
!subtitle:示例
local text = "Hello World"
print(string.byte(text, 3, 7))
string.char (···)
!subtitle:说明
通过字符编码生成字符串。
!subtitle:参数
... - 字符编码
!subtitle:返回值
返回生成的字符串
!subtitle:示例
print(string.char(72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100))
string.dump (function [, strip])
!subtitle:说明
将函数编译成二进制代码块,可以被 load 函数加载后调用。
!subtitle:参数
function - 要编译的函数
strip - 是否包含调试信息;默认为 false
!subtitle:返回值
返回生成的二进制代码块(字符串)
!subtitle:示例
function add(a, b)
return a + b
end
-- 将函数编译为二进制字符串
local binary_code = string.dump(add)
print(type(binary_code)) -- 输出: string
print(#binary_code) -- 输出: 二进制代码的长度
string.find (s, pattern [, init [, plain]])
!subtitle:说明
在字符串 s 中查找第一个匹配的 pattern,返回起始和结束位置的索引。
!subtitle:参数
!subtitle:返回值
成功时返回匹配字符串的首尾索引以及全部的子捕获
失败时返回 nil
!subtitle:示例
-- 简单查找子串
print(string.find("hello world", "world"))
print(string.find("hello world", "(world)"))
-- 模式匹配分析邮箱地址
print(string.find("[email protected]", "(.*)@([^%.]*)%.(.*)"))
string.format (fmt, ···)
!subtitle:说明
格式化生成字符串,参考 C 语言标准库函数 sprintf。
!subtitle:参数
fmt - 格式化字符串,参考 ISO C 格式
... - 额外参数
!subtitle:返回值
返回生成的字符串
!subtitle:示例
-- 整数格式化
print(string.format("整数: %d", 42)) -- 输出: 整数: 42
print(string.format("价格: %d 元", 100)) -- 输出: 价格: 100 元
-- 浮点数格式化
print(string.format("圆周率: %f", math.pi)) -- 输出: 圆周率: 3.141593
print(string.format("百分比: %.2f%%", 85.567)) -- 输出: 百分比: 85.57%
-- 科学计数法
print(string.format("科学计数: %e", 1234567)) -- 输出: 科学计数: 1.234567e+06
string.gmatch (s, pattern [, init])
!subtitle:说明
在字符串 s 中查找所有匹配模式 pattern 的字串,返回迭代器函数。
!subtitle:参数
s - 被搜索的字符串
pattern - 模式串,参考 模式匹配)
init - 开始搜索的位置索引;默认为 1
!subtitle:返回值
返回一个迭代器函数,每次迭代时返回一个匹配
!subtitle:示例
local text = "hello world from lua programming"
for word in string.gmatch(text, "%a+") do
print(word)
end
string.gsub (s, pattern, repl [, n])
!subtitle:说明
将字符串 s 中所有匹配模式 pattern 的字串替换为 repl。
!subtitle:参数
s - 被搜索的字符串
pattern - 模式串,参考 模式匹配)
repl - 用于替换的字符串,也可以是表或函数
字符串 - 直接替换,其中 % 是转义字符, %n 表示第 n 个子捕获
表 - 用匹配的子串作为索引读取元素,用该元素替换
函数 - 用匹配的子串作为参数调用函数,用返回值替换
n -
!subtitle:返回值
返回替换后的字符串和替换的次数
!subtitle:示例
-- 简单文本替换
print(string.gsub("hello world", "world", "Lua"))
-- 模式匹配
print(string.gsub("apple \t orange \n banana", "%s+", " "))
-- 查表替换
local repl_table = {apple="APPLE", orange="Orange", banana="Banana"}
print(string.gsub("apple orange banana", "%a+", repl_table))
-- 调用函数替换
local repl_func = function(text) print(string.sub(text, 1, 1)) end
print(string.gsub("apple orange banana", "%a+", repl_func))
string.len (s)
!subtitle:说明
获取字符串的长度。
!subtitle:参数
s - 要获取长度的字符串
!subtitle:返回值
返回字符串的长度
!subtitle:示例
print(string.len("")) -- 空字符串
print(string.len("Hello World"))
print(string.len("X\000Y\000Z")) -- 空字符 \000 也计算长度
string.lower (s)
!subtitle:说明
将字符串 s 转换为小写。
!subtitle:参数
s - 要转换的字符串
!subtitle:返回值
返回转换后的字符串
!subtitle:示例
print(string.lower("Hello World"))
string.match (s, pattern [, init])
!subtitle:说明
在字符串 s 中查找第一个与模式 pattern 匹配的字串。
!subtitle:参数
s - 被搜索的字符串
pattern - 模式串,参考 模式匹配)
init - 开始搜索的位置索引;默认为 1
!subtitle:返回值
成功时返回匹配的字串
失败时返回 nil
!subtitle:示例
-- 简单查找字串
print(string.match("Apple Orange Banana", "Orange"))
-- 模式匹配
print(string.match("Apple Orange Banana", "B%a*"))
string.pack (fmt, v1, v2, ···)
!subtitle:说明
将数据按照格式 fmt 打包成二进制块(字符串)。
返回的结果可以使用 string.unpack) 解包。
!subtitle:参数
fmt - 格式字符串
< - 设置小端
> - 设置大端
= - 设置本机字节序
![n] - 设置最大对齐方式 n (默认为原生对齐方式)
b - 有符号字节(char)
B - 无符号字节(char)
h - 有符号 short(本机大小)
H - 无符号 short(本机大小)
l - 有符号 long(本机大小)
L - 无符号 long(本机大小)
j - 一个 lua_Integer
J - 一个 lua_Unsigned
T - 一个 size_t(原始尺寸)
i[n] - n 字节有符号 int(默认为本机大小)
I[n] - n 字节无符号 int(默认为本机大小)
f - 一个 float(原始尺寸)
d -: 一个 double(原始尺寸)
n - 一个 lua_Number
cn - 具有 n 字节的固定大小字符串
z - 以零结尾的字符串
s[n] - 一个字符串,其长度以字节为单位编码为无符号整数n(默认为 a size_t)
x - 一个字节的填充
Xop - 根据选项对齐的空项op (否则将被忽略)
' '(空格)- 忽略,不会起到任何效果,可用于分隔格式字符提高可读性
!subtitle:返回值
返回生成的二进制字符串
!subtitle:示例
-- 打包
local binary = string.pack("iid", 100, 200, 3.14159)
print("打包大小:", #binary)
-- 解包
local v1, v2, v3, pos = string.unpack("iid", binary)
print(string.format("解包结果: %d, %d, %.5f", v1, v2, v3))
string.packsize (fmt)
!subtitle:说明
获取 string.pack) 使用 fmt 格式打包数据的结果大小。
!subtitle:参数
fmt - 格式字符串,参考 string.pack),不能使用可变长度的格式
!subtitle:返回值
返回预计打包大小
!subtitle:示例
print(string.packsize("iid"))
print(string.packsize("iidjj"))
string.rep (s, n [, sep])
!subtitle:说明
重复 n 次字符串 s,生成字符串。
!subtitle:参数
s - 要重复的字符串
n - 要重复的次数
sep - 重复时插入的分隔符
!subtitle:返回值
返回生成的字符串
!subtitle:示例
-- 简单重复
print(string.rep("Hello", 5))
-- 添加分隔符
print(string.rep("XXX", 5, "-"))
string.reverse (s)
!subtitle:说明
将字符串 s 反转。
!subtitle:参数
s - 要反转的字符串
!subtitle:返回值
返回反转后的字符串
!subtitle:示例
print(string.reverse("Hello World"))
string.sub (s, i [, j])
!subtitle:说明
从字符串 s 中提取索引 i 到 j 的字串。
!subtitle:参数
s - 要提取的字符串
i - 子串的起始索引
j - 字串的结束索引;默认为 -1
!subtitle:返回值
返回提取的字串
!subtitle:示例
print(string.sub("Primers 编程伙伴", 9))
string.unpack (fmt, s [, pos])
!subtitle:说明
从 string.pack) 生成的二进制块(字符串)中解包数据。
!subtitle:参数
fmt - 格式化字符串
s - 要解包的二进制块(字符串)
pos - 要解包的起始索引;默认为 1
!subtitle:返回值
返回解包的结果
!subtitle:示例
-- 打包
local binary = string.pack("iid", 100, 200, 3.14159)
print("打包大小:", #binary)
-- 解包
local v1, v2, v3, pos = string.unpack("iid", binary)
print(string.format("解包结果: %d, %d, %.5f", v1, v2, v3))
string.upper (s)
!subtitle:说明
将字符串 s 转换为打写。
!subtitle:参数
s - 要转换的字符串
!subtitle:返回值
返回转换后的字符串
!subtitle:示例
print(string.upper("Hello World"))
模式匹配是一种在字符串中查找、识别和提取特定模式的技术。在 Lua 中,模式匹配使用基于字符的模式而不是完整的正则表达式,但功能依然强大。
Lua 的魔法字符是在模式匹配中实用的特殊字符,包含 ^$()%.[]*+-?。
除了魔法字符 ^$()%.[]*+-? 以外的字符是普通字符,魔法字符可以实用 % 转义成普通字符。
%a - 代表任意 字母
%c - 代表任意 控制字符
%d - 代表任意 数字
%g - 代表任意 图形字符
%l - 代表任意 小写字母
%p - 代表任意 标点符号
%s - 代表任意 空白字符
%u - 代表任意 大写字母
%w - 代表任意 字母或数字
%x - 代表任意 十六进制数字
. - 代表任意字符
^ - 在模式开头时表示开头,否则表示普通字符
$ - 在模式末尾时表示末尾,否则表示普通字符
[set] - 代表字符集合
[^set] - 代表字符集合的补集
(xxx) - 子捕获
* - 表示前项匹配 $ \geq 0 $ 次,且优先匹配最长序列
+ - 表示前项匹配 $ \geq 1 $ 次,且优先匹配最长序列
- - 表示前项匹配 $ \geq 0 $ 次,且优先匹配最短序列
? - 表示前项匹配零或一次,且优先匹配一次
%n - n 是数字,在 1 到 9 之间,表示第 n 个子捕获
%bxy - x 和 y 是两个不同的字符,匹配以 x 开头 y 结尾的字符串
%f[set] - 边界模式,匹配 [set] 和 [^set] 的边界