国际访客建议访问 Primers 编程伙伴 国际版站点 > Lua 教程 > string-module 以获得更好的体验。

# Lua 的 String 模块

请查看 Lua 标准库模块列表 了解更多相关 API。
函数 说明
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]])

!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

string.char (···)

!subtitle:说明

通过字符编码生成字符串。

!subtitle:参数

  • ... - 字符编码

!subtitle:返回值

  • 返回生成的字符串

!subtitle:示例

运行示例

print(string.char(72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100))

# string.dump

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

string.find (s, pattern [, init [, plain]])

!subtitle:说明

在字符串 s 中查找第一个匹配的 pattern,返回起始和结束位置的索引。

!subtitle:参数

  • s - 被搜索的字符串

  • pattern - 模式串,参考 模式匹配)

  • init - 开始搜索的位置索引;默认为 1

  • plain - 是否是纯文本,为 true 时禁用 魔法字符);默认为 false

!subtitle:返回值

  • 成功时返回匹配字符串的首尾索引以及全部的子捕获

  • 失败时返回 nil

!subtitle:示例

运行示例

-- 简单查找子串
print(string.find("hello world", "world"))
print(string.find("hello world", "(world)"))

-- 模式匹配分析邮箱地址
print(string.find("[email protected]", "(.*)@([^%.]*)%.(.*)"))

# string.format

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

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

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

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

string.lower (s)

!subtitle:说明

将字符串 s 转换为小写。

!subtitle:参数

  • s - 要转换的字符串

!subtitle:返回值

  • 返回转换后的字符串

!subtitle:示例

运行示例

print(string.lower("Hello World"))

# string.match

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

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

string.packsize (fmt)

!subtitle:说明

获取 string.pack) 使用 fmt 格式打包数据的结果大小。

!subtitle:参数

  • fmt - 格式字符串,参考 string.pack),不能使用可变长度的格式

!subtitle:返回值

  • 返回预计打包大小

!subtitle:示例

运行示例

print(string.packsize("iid"))
print(string.packsize("iidjj"))

# string.rep

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

string.reverse (s)

!subtitle:说明

将字符串 s 反转。

!subtitle:参数

  • s - 要反转的字符串

!subtitle:返回值

  • 返回反转后的字符串

!subtitle:示例

运行示例

print(string.reverse("Hello World"))

# string.sub

string.sub (s, i [, j])

!subtitle:说明

从字符串 s 中提取索引 ij 的字串。

!subtitle:参数

  • s - 要提取的字符串

  • i - 子串的起始索引

  • j - 字串的结束索引;默认为 -1

!subtitle:返回值

  • 返回提取的字串

!subtitle:示例

运行示例

print(string.sub("Primers 编程伙伴", 9))

# string.unpack

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

string.upper (s)

!subtitle:说明

将字符串 s 转换为打写。

!subtitle:参数

  • s - 要转换的字符串

!subtitle:返回值

  • 返回转换后的字符串

!subtitle:示例

运行示例

print(string.upper("Hello World"))

# 模式匹配

模式匹配是一种在字符串中查找、识别和提取特定模式的技术。在 Lua 中,模式匹配使用基于字符的模式而不是完整的正则表达式,但功能依然强大。

# 魔法字符

Lua 的魔法字符是在模式匹配中实用的特殊字符,包含 ^$()%.[]*+-?

除了魔法字符 ^$()%.[]*+-? 以外的字符是普通字符,魔法字符可以实用 % 转义成普通字符。

# 基本项

# 模式项

  • * - 表示前项匹配 $ \geq 0 $ 次,且优先匹配最长序列

  • + - 表示前项匹配 $ \geq 1 $ 次,且优先匹配最长序列

  • - - 表示前项匹配 $ \geq 0 $ 次,且优先匹配最短序列

  • ? - 表示前项匹配零或一次,且优先匹配一次

  • %n - n 是数字,在 1 到 9 之间,表示第 n 个子捕获

  • %bxy - xy 是两个不同的字符,匹配以 x 开头 y 结尾的字符串

  • %f[set] - 边界模式,匹配 [set][^set] 的边界

# 推荐阅读

本文 更新于: 2025-11-27 09:38:13 创建于: 2025-11-27 09:38:13