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