目录

  1. 什么是 Lua 字符串
  2. 为什么要使用字符串
  3. Lua 字符串的定义与特性
  4. 代码示例
  1. 字符串常用函数
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 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 文本。

常见问题与注意事项

  1. UTF-8 长度
  • # 返回字节数而非字符数,中文字符占 3 字节。
  • 需用 UTF-8 库(如 lua-utf8)处理字符。
  1. 性能
  • 频繁拼接用 table.concat 替代 ..
   local t = {}
   for i = 1, 1000 do t[i] = "a" end
   local s = table.concat(t)  -- 更快
  1. 转义
  • 单/双引号中需用 \ 转义特殊字符(如 \n)。
  1. 模式匹配限制
  • 不支持完整正则表达式,需掌握 Lua 特定模式。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更深入的字符串操作(如 UTF-8 处理或复杂模式),请告诉我,我会进一步扩展!