5.1 字符串声明方式
Lua 支持三种声明字符串的方式:
单引号与双引号
两种方式完全等价,可以互相嵌套:
1 2 3 4
| s1 = "双引号字符串" s2 = '单引号字符串' s3 = "她说:'你好'" s4 = '他说:"世界"'
|
长括号 [[ ]]
长括号用于声明多行字符串,无需转义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| local html = [[ <html> <body> <p>Hello Lua</p> </body> </html> ]]
local code = [=[ local x = 10 local y = 20 print("x + y = " .. x + y) -- 这里可以安全地使用 ]] 符号 ]=]
print(code)
|
5.2 转义字符
| 转义 |
含义 |
\n |
换行 |
\t |
制表符 |
\\ |
反斜杠 |
\" |
双引号 |
\' |
单引号 |
\r |
回车 |
\b |
退格 |
\a |
响铃 |
\xNN |
十六进制字节(例:\x41 为 ‘A’) |
\NNN |
十进制字节 |
1 2 3 4 5 6 7 8 9 10 11 12
| print("第一行\n第二行")
print("路径:C:\\Users\\Lua")
print("制表符:\t缩进")
print("\x48\x65\x6C\x6C\x6F")
|
5.3 字符串是不可变值
在 Lua 中,字符串是不可变的。任何修改操作都会创建新的字符串:
1 2 3 4 5 6 7 8 9
| local s = "hello" local t = s:upper()
print(s) print(t)
local a = "abc" a = a .. "def"
|
5.4 字符串库常用函数
Lua 的字符串库函数可以通过 string.func() 或面向对象风格 s:func() 调用。
获取长度
1 2 3 4 5
| print(#"hello")
print(string.len("hello"))
|
大小写转换
1 2 3 4
| local s = "Hello Lua"
print(string.lower(s)) print(string.upper(s))
|
截取子串 string.sub
1 2 3 4 5 6 7 8 9 10
| local s = "Hello Lua"
print(s:sub(1, 5)) print(s:sub(7, 9)) print(s:sub(-3)) print(s:sub(7)) print(s:sub(1, -4))
|
查找 string.find
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| local s = "Hello Lua World"
local start, stop = s:find("Lua") print(start, stop)
print(s:find("Python"))
print(s:find("o", 5))
print(s:find("%u"))
|
匹配 string.match
1 2 3 4 5 6 7 8 9
| local s = "今天是 2026-06-01"
local year = s:match("%d+") print(year)
local _, month, day = s:match("(%d+)-(%d+)-(%d+)") print(month, day)
|
全局匹配 string.gmatch
1 2 3 4 5 6 7 8 9 10
| local s = "apple, banana, cherry"
for word in s:gmatch("%a+") do print(word) end
|
全局替换 string.gsub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| local s = "hello world, hello lua"
local result, count = s:gsub("hello", "hi") print(result) print(count)
result = s:gsub("hello", "hi", 1) print(result)
result = s:gsub("%a+", function(word) return word:upper() end) print(result)
|
其他实用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| print(string.rep("ab", 3))
print(string.reverse("hello"))
print(string.format("姓名:%s,年龄:%d,分数:%.1f", "张三", 25, 87.5))
print(string.format("%02d:%02d:%02d", 8, 5, 3))
|
5.5 Lua 模式匹配
Lua 的模式匹配不是正则表达式(Regex),而是一个轻量级的替代方案,语法更简洁。
字符类
| 模式 |
匹配 |
. |
任意字符 |
%a |
字母 |
%l |
小写字母 |
%u |
大写字母 |
%d |
数字 |
%w |
字母和数字 |
%s |
空白字符 |
%p |
标点符号 |
%c |
控制字符 |
%x |
十六进制数字 |
%z |
NULL 字符 |
大写字母字符类表示补集:
魔法字符
这些字符有特殊含义,匹配字面量时需要加 % 转义:
1 2 3 4 5 6 7 8 9
| print(string.match("hello.world", "%."))
print(string.match("func(arg)", "%("))
print(string.match("hello", "[aeiou]")) print(string.match("hello", "[^aeiou]"))
|
数量修饰符
| 修饰符 |
含义 |
+ |
一个或多个(最长匹配) |
* |
零个或多个(最长匹配) |
- |
零个或多个(最短匹配) |
? |
零个或一个 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| print(string.match("123abc456", "%d+"))
print(string.match("abc123", "%d*")) print(string.match("123abc", "%d*"))
local s = "a---b---c" print(s:match("%a.-%a")) print(s:match("%a.*%a"))
print(string.match("color", "colou?r")) print(string.match("colour", "colou?r"))
|
边界与分支
1 2 3 4 5 6 7 8 9 10
| print(string.match("hello world", "^hello")) print(string.match("say hello", "^hello"))
print(string.match("hello world", "world$")) print(string.match("hello world!", "world$"))
|
捕获(Captures)
圆括号 () 用于捕获匹配的子串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| local s = "2026-06-01"
local year, month, day = s:match("(%d+)-(%d+)-(%d+)") print(year, month, day)
local _, inner = string.match("{{content}}", "{(.+)})") print(inner)
local s = "name = John, age = 25" local result = s:gsub("(%w+) = (%w+)", "%1:%2") print(result)
|
常用模式示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| local function is_email(s) return s:match("^[%w%.%%%+%-_]+@[%w%-_]+%.%w+$") ~= nil end
local function extract_numbers(s) local nums = {} for num in s:gmatch("%d+") do table.insert(nums, tonumber(num)) end return nums end
local function strip_html(s) return s:gsub("<[^>]+>", "") end
local function template(tpl, params) return tpl:gsub("{(%w+)}", params) end
local tpl = "您好,{name},您的验证码是{code}" local result = template(tpl, {name = "张三", code = "8848"}) print(result)
|
5.6 本章小结
- 字符串可用
""、''、[[]] 声明
.. 连接字符串,字符串不可变
- 常用函数:
sub、find、match、gmatch、gsub、format
- 模式匹配是轻量级正则的替代品
- 字符类
%d、%a、%w 等,大写为补集
- 修饰符
+、*、-、? 控制重复次数
- 捕获
() 提取匹配内容
练习题
- 使用
string.gsub 将字符串中的数字替换为 [数字]
- 从
"2026-06-01 14:30:00" 中提取年月日时分秒
- 实现一个函数检查字符串是否为回文(正反读一样)
- 使用模式匹配提取一段文本中所有以
# 开头的标签(如 #Lua、#编程)
- 用
string.format 格式化表格数据:
1 2 3
| 姓名 年龄 分数 张三 25 87.5 李四 30 92.0
|