元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Lua语言基础
▶
环境搭建
安装Lua解释器
配置开发环境
第一个Lua程序
▶
基本语法
变量与数据类型
运算符与表达式
控制结构
▶
数据结构
表(Table)详解
数组与迭代
字符串处理
▶
Lua高级编程
▶
函数编程
函数定义与调用
闭包与作用域
高阶函数应用
▶
元表与元方法
元表基础
操作符重载
继承与对象系统
▶
协程编程
协程基础
生产者-消费者模式
协程调度实践
▶
Lua应用实践
▶
游戏开发
Lua与游戏引擎集成
AI脚本实现
热更新机制
▶
系统编程
Lua与C交互
扩展库开发
性能优化技巧
▶
实用工具开发
配置文件解析
自动化测试框架
网络编程基础
发布时间:
2025-03-24 12:03
↑
☰
# Lua字符串处理 本文将介绍Lua中字符串的基本操作和高级用法,帮助你掌握字符串处理的各种技巧。 ## 字符串基础 ### 1. 字符串声明 ```lua -- 使用单引号 local str1 = 'Hello' -- 使用双引号 local str2 = "World" -- 多行字符串 local str3 = [[ 这是一个 多行字符串 ]] -- 带等号的多行字符串(用于避免内容中的[[ ]] ) local str4 = [==[ 这是一个包含[[的字符串 ]==] ``` ### 2. 转义字符 ```lua -- 常用转义字符 local str = "第一行\n第二行\t缩进\"引号\\" print(str) -- 原始字符串(不处理转义) local path = [[C:\Windows\System32]] ``` ### 3. 字符串连接 ```lua -- 使用..运算符 local name = "Lua" local version = "5.4" local info = name .. " " .. version -- "Lua 5.4" -- 使用table.concat(更高效) local parts = {"Hello", "World", "!"} local message = table.concat(parts, " ") -- "Hello World !" ``` ## 字符串操作 ### 1. 基本操作 ```lua -- 获取长度 local str = "Hello" print(#str) -- 5 -- 字符串索引(使用string.sub) local first = string.sub(str, 1, 1) -- "H" local last = string.sub(str, -1) -- "o" local sub = string.sub(str, 2, 4) -- "ell" ``` ### 2. 大小写转换 ```lua -- 转换为大写 local upper = string.upper("hello") -- "HELLO" -- 转换为小写 local lower = string.lower("WORLD") -- "world" ``` ### 3. 查找和替换 ```lua -- 查找子串 local str = "Hello, World!" local pos = string.find(str, "World") -- 8 -- 替换子串 local new_str = string.gsub(str, "World", "Lua") -- "Hello, Lua!" -- 替换多个匹配 local text = "one two one three one" local result, count = string.gsub(text, "one", "1") print(result) -- "1 two 1 three 1" print(count) -- 3 ``` ### 4. 字符串格式化 ```lua -- 基本格式化 local name = "张三" local age = 25 local info = string.format("%s今年%d岁", name, age) -- 常用格式说明符 print(string.format("%d", 42)) -- 整数 print(string.format("%.2f", 3.1415)) -- 浮点数 print(string.format("%x", 255)) -- 十六进制 print(string.format("%q", "引号")) -- 带引号的字符串 ``` ## 模式匹配 Lua的模式匹配类似于正则表达式,但语法更简单: ### 1. 基本模式 ```lua -- 字符类 . -- 任意字符 %a -- 字母 %d -- 数字 %s -- 空白字符 %w -- 字母和数字 %l -- 小写字母 %u -- 大写字母 %p -- 标点符号 -- 修饰符 * -- 0或多次 + -- 1或多次 - -- 0或多次(最小匹配) ? -- 0或1次 ``` ### 2. 模式匹配示例 ```lua -- 匹配邮箱 local email = "user@example.com" local pattern = "%w+@%w+%.%w+" print(string.match(email, pattern)) -- "user@example.com" -- 提取数字 local text = "价格是123.45元" local price = string.match(text, "%d+%.?%d*") print(price) -- "123.45" -- 分割字符串 local data = "apple,banana,orange" for item in string.gmatch(data, "[^,]+") do print(item) end ``` ### 3. 高级模式匹配 ```lua -- 捕获 local date = "2023-12-25" local year, month, day = string.match(date, "(%d+)-(%d+)-(%d+)") -- 平衡组 local function findMatching(str) local pattern = "%b()" return string.match(str, pattern) end print(findMatching("(hello (world))")) -- "(hello (world))" ``` ## Unicode支持 ### 1. UTF-8编码 ```lua -- 使用utf8库 local utf8 = require("utf8") -- 获取字符串长度(Unicode字符数) local str = "你好,世界!" print(utf8.len(str)) -- 6 -- 遍历Unicode字符 for pos, code in utf8.codes(str) do print(pos, code) end ``` ### 2. Unicode操作 ```lua -- 提取子串(按Unicode字符) local str = "你好,世界!" local start = utf8.offset(str, 1) -- 第1个字符的起始位置 local finish = utf8.offset(str, 3) - 1 -- 第2个字符的结束位置 print(string.sub(str, start, finish)) -- "你好" -- 验证UTF-8编码 local function isValidUTF8(str) return pcall(utf8.len, str) end ``` ## 常见问题解答 ### Q1: 如何高效地处理大量字符串拼接? 使用`table.concat`而不是`..`运算符: ```lua local parts = {} for i = 1, 1000 do parts[i] = tostring(i) end local result = table.concat(parts, ", ") ``` ### Q2: 如何处理中文字符串? ```lua -- 使用UTF-8库 local utf8 = require("utf8") local str = "中文字符串" -- 获取正确的长度 print(utf8.len(str)) -- 5 -- 正确截取 local sub = string.sub(str, 1, utf8.offset(str, 3) - 1) -- "中文" ``` ### Q3: 如何转换字符串和其他类型? ```lua -- 字符串转数字 local num = tonumber("42") -- 42 local float = tonumber("3.14") -- 3.14 -- 数字转字符串 local str1 = tostring(42) -- "42" local str2 = string.format("%d", 42) -- "42" ``` ## 下一步 现在你已经掌握了Lua的字符串处理,可以继续学习[函数定义与调用](/article/lua/advanced/functions)来了解如何组织和重用代码。 ## 参考资源 - [Lua 5.4 参考手册 - 字符串库](http://www.lua.org/manual/5.4/manual.html#6.4) - [Lua 字符串模式匹配](http://www.lua.org/manual/5.4/manual.html#6.4.1) - [UTF-8 支持](http://www.lua.org/manual/5.4/manual.html#6.5)