目录
什么是 Lua 字符串
Lua 字符串 (string) 是 Lua 中的一种基本数据类型,表示不可变的字符序列。字符串可以用单引号 '
、双引号 "
或长括号 [[]]
定义,广泛用于存储和处理文本数据。
为什么要使用字符串
- 文本处理:表示和操作文本信息。
- 数据交互:在输入输出、文件操作中传递数据。
- 动态性:支持灵活的拼接和格式化。
- 通用性:跨平台文本表示的基础。
Lua 字符串的定义与特性
- 定义方式:
- 单引号:
'hello'
- 双引号:
"hello"
- 长括号:
[[hello]]
(支持多行,无需转义)。 - 不可变性:字符串内容不可直接修改,操作生成新字符串。
- 编码:默认 8 位字节序列,支持 UTF-8(需额外处理)。
- 长度:使用
#
获取字节数。
代码示例
字符串定义与连接
-- 定义字符串
local s1 = "Hello"
local s2 = 'Lua'
local s3 = [[
多行
文本]]
-- 连接字符串
local greeting = s1 .. " " .. s2
print(greeting)
print(s3)
运行结果:
Hello Lua
多行
文本
字符串操作
-- 长度
local text = "你好, Lua"
print("长度: " .. #text) -- UTF-8 编码下为字节数
-- 子串
print(string.sub(text, 1, 3)) -- 前 3 个字节
-- 转大小写
local str = "Hello"
print(string.upper(str)) -- 大写
print(string.lower(str)) -- 小写
运行结果:
长度: 10
你
HELLO
hello
模式匹配
local str = "Hello, Lua 123"
-- 查找
local start, end_ = string.find(str, "Lua")
print("找到 Lua 在: " .. start .. "-" .. end_)
-- 替换
local newStr = string.gsub(str, "%d+", "Numbers")
print(newStr)
-- 匹配第一个数字
local num = string.match(str, "%d+")
print("匹配到的数字: " .. num)
运行结果:
找到 Lua 在: 8-10
Hello, Lua Numbers
匹配到的数字: 123
字符串常用函数
函数 | 描述 | 示例 |
---|---|---|
string.len(s) | 返回字符串长度(同 # ) | string.len("abc") → 3 |
string.sub(s, i, j) | 提取子串(从 i 到 j) | string.sub("hello", 2, 4) → “ell” |
string.upper(s) | 转为大写 | string.upper("hi") → “HI” |
string.lower(s) | 转为小写 | string.lower("HI") → “hi” |
string.find(s, pattern) | 查找模式,返回起止位置 | string.find("abc123", "%d+") → 4, 6 |
string.gsub(s, pattern, repl) | 替换模式 | string.gsub("a,a", ",", ";") → “a;a” |
string.match(s, pattern) | 返回匹配内容 | string.match("abc123", "%d+") → “123” |
工作原理详解
- 存储:字符串在 Lua 中是不可变的,存储在内部字符串池中,重复字符串共享内存。
- 操作:每次修改(如拼接)生成新字符串,原字符串不变。
- 模式匹配:基于 Lua 的正则表达式子集,高效解析文本。
优点与应用场景
优点
- 简洁:多种定义方式适应不同场景。
- 高效:字符串池优化内存使用。
- 强大:模式匹配支持复杂文本处理。
应用场景
- 日志输出:拼接信息。
- 配置文件:解析文本数据。
- 游戏脚本:处理对话或 UI 文本。
常见问题与注意事项
- UTF-8 长度:
#
返回字节数而非字符数,中文字符占 3 字节。- 需用 UTF-8 库(如
lua-utf8
)处理字符。
- 性能:
- 频繁拼接用
table.concat
替代..
。
local t = {}
for i = 1, 1000 do t[i] = "a" end
local s = table.concat(t) -- 更快
- 转义:
- 单/双引号中需用
\
转义特殊字符(如\n
)。
- 模式匹配限制:
- 不支持完整正则表达式,需掌握 Lua 特定模式。
参考资料与出站链接
- 官方文档:
- 学习资源:
- 工具支持:
- ZeroBrane Studio:调试字符串。
如果您需要更深入的字符串操作(如 UTF-8 处理或复杂模式),请告诉我,我会进一步扩展!
发表回复