Lua 字符串

关键要点

  • 研究表明,Lua 的字符串是不可变的字符序列,支持单引号、双引号和多行 [[]] 格式,广泛用于文本处理。
  • 证据显示,Lua 提供丰富的字符串操作函数(如 string.lenstring.sub),通过 .. 连接字符串,# 获取长度。
  • 看起来很可能是通过 string 库和模式匹配(pattern matching)实现复杂字符串操作,支持 UTF-8 编码处理中文。

Lua 字符串简介

概述

Lua 的字符串是不可变的字符序列,支持单引号 ', 双引号 " 和多行 [[]] 格式,适用于文本存储和操作。Lua 提供内置的 string 库,包含长度计算、子串提取、模式匹配等功能。字符串操作简单高效,特别适合处理中文等 Unicode 文本。本文详细讲解 Lua 字符串的定义、操作、模式匹配、示例及注意事项。

字符串特性

  • 定义方式:单引号、双引号或多行 [[]]
  • 不可变性:字符串内容不可直接修改,操作返回新字符串。
  • 连接:使用 .. 连接字符串。
  • 长度:使用 #string.len 获取字符数。
  • 操作函数string 库提供 string.substring.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):提取子串,从索引 ij(包含)。
    • 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(按字符计数)

实际应用示例

以下是一个综合示例,展示字符串操作和模式匹配:

-- 示例:学生信息解析
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 优化。

推荐资源

这些资源基于当前可访问的在线内容,截至 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, %wstring.match("123", "%d+")

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注