Lua 字符串
关键要点
- 研究表明,Lua 的字符串是不可变的字符序列,支持单引号、双引号和多行
[[]]
格式,广泛用于文本处理。 - 证据显示,Lua 提供丰富的字符串操作函数(如
string.len
、string.sub
),通过..
连接字符串,#
获取长度。 - 看起来很可能是通过
string
库和模式匹配(pattern matching)实现复杂字符串操作,支持 UTF-8 编码处理中文。
Lua 字符串简介
概述
Lua 的字符串是不可变的字符序列,支持单引号 '
, 双引号 "
和多行 [[]]
格式,适用于文本存储和操作。Lua 提供内置的 string
库,包含长度计算、子串提取、模式匹配等功能。字符串操作简单高效,特别适合处理中文等 Unicode 文本。本文详细讲解 Lua 字符串的定义、操作、模式匹配、示例及注意事项。
字符串特性
- 定义方式:单引号、双引号或多行
[[]]
。 - 不可变性:字符串内容不可直接修改,操作返回新字符串。
- 连接:使用
..
连接字符串。 - 长度:使用
#
或string.len
获取字符数。 - 操作函数:
string
库提供string.sub
、string.gsub
等。 - 模式匹配:支持正则表达式风格的模式匹配。
参考资源
详细调研报告
本文为用户提供关于 Lua 字符串的全面中文讲解,涵盖字符串定义、基本操作、字符串库函数、模式匹配、示例及注意事项,基于可靠的在线资源和官方文档。
Lua 字符串概述
Lua 的字符串是不可变的字节序列,存储文本数据,支持 UTF-8 编码,适合处理中文。研究表明,Lua 通过 string
库和模式匹配提供强大的字符串操作功能,..
和 #
是常用的字符串运算符。以下是详细分析:
- 字符串定义:
- 单引号和双引号:用于短字符串,功能相同。
lua local str1 = "Hello, Lua!" local str2 = '你好,Lua!' print(str1, str2) -- 输出:Hello, Lua! 你好,Lua! print(type(str1)) -- 输出:string
- 多行字符串:使用
[[]]
定义,适合多行文本或包含引号的字符串。lua local multiline = [[ 第一行 第二行 ]] print(multiline)
输出:第一行 第二行
- 转义字符:使用
\
转义特殊字符,如\n
(换行)、\"
(双引号)。lua local str = "Line1\nLine2" print(str) -- 输出:Line1(换行)Line2
- 注意:多行字符串
[[]]
不需转义引号,适合包含复杂文本。 - 基本操作:
- 连接(
..
):将多个字符串拼接为一个。lua local str = "Hello" .. " Lua" print(str) -- 输出:Hello Lua print(10 .. " 分") -- 输出:10 分(数字自动转为字符串)
- 长度(
#
或string.len
):返回字符串的字符数(字节数)。lua local str = "你好" print(#str) -- 输出:6(UTF-8 编码下,每个中文字符占 3 字节) print(string.len(str)) -- 输出:6
- 注意:
#
在 UTF-8 中返回字节数,非字符数,中文处理需注意。- 示例(英文):
local eng = "Hello" print(#eng) -- 输出:5(英文字符占 1 字节)
- 字符串库函数:
- Lua 的
string
库提供丰富的字符串操作函数,常用函数包括:string.len(s)
:返回字符串长度(等同于#
)。string.lower(s)
:转为小写。string.upper(s)
:转为大写。string.sub(s, i, j)
:提取子串,从索引i
到j
(包含)。string.gsub(s, pattern, repl, n)
:替换匹配模式的内容,n
为可选替换次数。string.find(s, pattern, init, plain)
:查找模式,返回匹配位置。string.format(fmt, ...)
:格式化字符串,类似 C 的printf
。
- 示例:
local str = "Hello, Lua!" print(string.len(str)) -- 输出:10 print(string.lower(str)) -- 输出:hello, lua! print(string.upper(str)) -- 输出:HELLO, LUA! print(string.sub(str, 1, 5)) -- 输出:Hello print(string.gsub(str, "Lua", "World")) -- 输出:Hello, World! 1 local i, j = string.find(str, "Lua") -- 输出:8 10 print(i, j) print(string.format("分数: %d, 名称: %s", 95, "Alice")) -- 输出:分数: 95, 名称: Alice
- 模式匹配:
- Lua 使用模式匹配(pattern matching)而非标准正则表达式,支持特定模式字符。
- 常用模式字符:
.
:任意字符。%a
:字母。%d
:数字。%s
:空白字符。%w
:字母或数字。^
:匹配字符串开头。$
:匹配字符串结尾。[]
:字符集。*
:0 次或多次。+
:1 次或多次。-
:0 次或多次(非贪婪)。?
:0 次或 1 次。
- 示例:
lua local str = "Email: alice@example.com, Phone: 123-456-7890" local email = string.match(str, "%w+@%w+%.%w+") -- 匹配邮箱 print(email) -- 输出:alice@example.com local phone = string.match(str, "%d%d%d%-%d%d%d%-%d%d%d%d") -- 匹配电话 print(phone) -- 输出:123-456-7890 for word in string.gmatch(str, "%w+") do print(word) -- 输出:Email alice example com Phone 123 456 7890 end
- 注意:
- 模式匹配不支持完整的正则表达式,但足够处理常见任务。
- 需转义特殊字符(如
%
前加%
)。
- 中文字符串处理:
- Lua 默认以字节处理字符串,中文字符在 UTF-8 编码下占 3 字节。
- 示例:
lua local str = "你好,Lua!" print(#str) -- 输出:12(4 个中文字符 × 3 字节 + 3 个英文字符) print(string.sub(str, 1, 3)) -- 输出:你(前 3 字节,仅一个字符)
- 处理中文字符:
- 使用 Lua 的 UTF-8 扩展库(如
lua-utf8
)或自定义函数按字符操作。 - 示例(需安装
lua-utf8
):lua local utf8 = require("utf8") local str = "你好,Lua!" print(utf8.len(str)) -- 输出:7(按字符计数)
- 使用 Lua 的 UTF-8 扩展库(如
实际应用示例
以下是一个综合示例,展示字符串操作和模式匹配:
-- 示例:学生信息解析
local student = "姓名: 张伟, 分数: 85, 邮箱: zhangwei@example.com"
-- 基本操作
print("字符串长度: " .. #student) -- 输出:字符串长度: 38(字节)
print("大写: " .. string.upper(student)) -- 输出:大写: 姓名: 张伟, 分数: 85, 邮箱: ZHANGWEI@EXAMPLE.COM
-- 提取子串
local name = string.sub(student, 4, 9) -- 张伟(3 个中文字符 × 3 字节)
print("姓名: " .. name)
-- 模式匹配
local score = string.match(student, "分数: (%d+)") -- 提取分数
print("分数: " .. score) -- 输出:分数: 85
local email = string.match(student, "邮箱: (%w+@%w+%.%w+)")
print("邮箱: " .. email) -- 输出:邮箱: zhangwei@example.com
-- 格式化输出
local report = string.format("学生信息: %s, 分数: %d", name, tonumber(score))
print(report) -- 输出:学生信息: 张伟, 分数: 85
-- 多行字符串
local multiline = [[
学生: 张伟
成绩: 优秀
]]
print(multiline)
-- 示例:学生信息解析
local student = "姓名: 张伟, 分数: 85, 邮箱: zhangwei@example.com"
-- 基本操作
print("字符串长度: " .. #student) -- 输出:字符串长度: 38(字节)
print("大写: " .. string.upper(student)) -- 输出:大写: 姓名: 张伟, 分数: 85, 邮箱: ZHANGWEI@EXAMPLE.COM
-- 提取子串
local name = string.sub(student, 4, 9) -- 张伟(3 个中文字符 × 3 字节)
print("姓名: " .. name)
-- 模式匹配
local score = string.match(student, "分数: (%d+)") -- 提取分数
print("分数: " .. score) -- 输出:分数: 85
local email = string.match(student, "邮箱: (%w+@%w+%.%w+)")
print("邮箱: " .. email) -- 输出:邮箱: zhangwei@example.com
-- 格式化输出
local report = string.format("学生信息: %s, 分数: %d", name, tonumber(score))
print(report) -- 输出:学生信息: 张伟, 分数: 85
-- 多行字符串
local multiline = [[
学生: 张伟
成绩: 优秀
]]
print(multiline)
输出:
字符串长度: 38
大写: 姓名: 张伟, 分数: 85, 邮箱: ZHANGWEI@EXAMPLE.COM
姓名: 张伟
分数: 85
邮箱: zhangwei@example.com
学生信息: 张伟, 分数: 85
学生: 张伟
成绩: 优秀
注意事项
- 不可变性:字符串操作(如
string.gsub
)返回新字符串,原字符串不变。 - UTF-8 编码:中文字符占 3 字节,
#
和string.len
返回字节数,需lua-utf8
按字符处理。 - 模式匹配:Lua 的模式匹配非标准正则表达式,需熟悉特定模式字符。
- 类型转换:字符串与数字连接时,自动调用
tostring()
,但需确保格式正确。 - 编码:中文字符串需保存为 UTF-8 编码,避免乱码。
- 性能:频繁字符串操作(如多次
..
)可能影响性能,建议使用table.concat
优化。
推荐资源
- 菜鸟教程 – Lua 字符串:提供简单字符串示例。
- Lua 官方手册:权威字符串参考。
- LuaScripts – Lua Tutorials:实用教程和示例。
这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。
结论
Lua 的字符串功能强大,支持单引号、双引号和多行格式,结合 string
库和模式匹配实现灵活的文本处理。推荐熟悉 string
库函数和模式匹配规则,使用 UTF-8 编码处理中文字符串。用户可通过示例练习掌握字符串操作,结合 IDE(如 ZeroBrane Studio)提高开发效率。
表格总结
功能 | 描述 | 示例 |
---|---|---|
定义 | 单引号、双引号、多行 [[]] | "Hello" , [[多行]] |
连接 | 使用 .. | "Hello" .. " Lua" |
长度 | 使用 # 或 string.len | #"Hello" |
子串 | string.sub(s, i, j) | string.sub("Hello", 1, 3) |
替换 | string.gsub(s, pattern, repl) | string.gsub("Hello", "l", "x") |
查找 | string.find(s, pattern) | string.find("Hello", "ll") |
格式化 | string.format(fmt, ...) | string.format("分数: %d", 95) |
模式匹配 | 使用模式字符(如 %d , %w ) | string.match("123", "%d+") |