lua内置的库,直接require就可以用
math库
--取整
print(math.floor(3.9)) -- 向下取整 3
print(math.ceil(3.1)) -- 向上取整 4
print(math.modf(3.1)) -- 拆分整数和小数部分,返回两个值(整数 + 小数) 3 0.1
--绝对值
print(math.abs(-5))
--幂运算
print(2 ^ 3)
--随机数
math.randomseed(os.time()) -- 初始化随机种子
print(math.random()) -- 输出类似:0.789456
print(math.random(100)) -- 输出 1~100 之间的整数
print(math.random(10, 20)) -- 输出 10~20 之间的整数
-- 生成 [0,10) 之间的浮点数
local float_rand = math.random() * 10
print(float_rand) -- 输出类似:6.2345
-- 最大值,最小值
print(math.max(1, 5, 3, 9)) -- 输出:9
print(math.min(-2, 0, 4, -5)) -- 输出:-5
-- 去余数
print(math.fmod(7, 3)) -- 输出:1
print(7 % 3) -- 输出:1
print(math.fmod(-7, 3)) -- 输出:-1(% 运算符在Lua中结果符号与y一致,fmod与x一致)
string库
覆盖字符串查找、替换、截取、匹配(正则)等所有字符串操作:
local str = require("string") -- 也可直接用全局 string,或字符串对象方法
-- 核心功能(两种调用方式:string.xxx 或 str:xxx)
local s = " hello lua "
str1 = string.format("我的名字是:%s 我的年龄是:%d, 面积是:%.2f", "fengfeng", 21, 3.1415)
print(str1) -- 我的名字是:fengfeng 我的年龄是:21, 面积是:3.14
print(str.sub(s, 3, 7)) -- 截取子串(索引 3-7)→ "hello"
print(str.find(s, "lua")) -- 查找子串位置 → 9 11
print(string.gsub(s, "lua", "python")) -- 替换 → " hello python "
print(string.match(s, "%a+")) -- 模式匹配(字母)→ "hello"
-- 字符串对象方法(更简洁)
print(s:upper()) -- 转大写 → " HELLO LUA "
print(s:len()) -- 长度 → 10
模式匹配
Lua 没有独立的正则表达式库,而是内置了轻量的模式匹配,核心差异如下:
| 功能 | 标准正则 | Lua 模式匹配 | 说明 |
|---|---|---|---|
| 字母匹配 | [a-zA-Z] |
%a |
Lua 用 % 代替 `` 转义 |
| 数字匹配 | \d |
%d |
|
| 任意字符 | . |
. |
一致 |
| 重复匹配(1 + 次) | + |
+ |
一致 |
| 重复匹配(0 + 次) | * |
* |
一致 |
| 匹配开头 | ^ |
^ |
一致 |
| 匹配结尾 | $ |
$ |
一致 |
| 非贪婪匹配 | +?/*? |
无(默认贪婪) | Lua 仅支持贪婪匹配 |
| 分组捕获 | (...) |
(...) |
一致,但不支持非捕获组 |
| 反义匹配(非字母) | [^a-zA-Z] |
%A |
大写字母表示 “反义” |
-- 1. 提取字符串中的第一个数字
local s1 = "价格:99元"
local num = string.match(s1, "%d+")
print(num) -- 输出:99
local s = "name=张三,age=25"
-- 模式中的两个()分别捕获 键 和 值
local key, value = string.match(s, "(%a+)=([^,]+)")
print("键:", key) -- 输出:键:name
print("值:", value) -- 输出:值:张三
-- 3. 匹配以特定字符开头/结尾的字符串
local s3 = "hello.lua"
local prefix = string.match(s3, "^%a+") -- 匹配开头的字母
local suffix = string.match(s3, "%a+$") -- 匹配结尾的字母
print(prefix, suffix) -- 输出:hello lua
table库
补充 table 的通用操作(Lua 原生 table 仅支持 # 取长度,复杂操作需库函数):
local tbl = require("table")
-- 核心功能
local t = { 3, 1, 2 }
table.sort(t) -- 默认升序
print(table.concat(t, ",")) --1,2,3
table.insert(t, 10) -- 插入元素 在最后插入元素 10
print(table.concat(t, ",")) --1,2,3,10
table.insert(t, 2, 99) -- 插入元素(位置 2 插入 99)
print(table.concat(t, ",")) -- 1,99,2,3,10
--移除最后一个元素并返回
print(table.remove(t)) -- 10
--指定位置移除
table.remove(t, 2)
print(table.concat(t, ",")) -- 1,2,3
排序
sort默认是升序,如果需要降序,就需要自定义排序函数了
-- 数字排序
local nums = {5, 2, 9, 1, 7}
table.sort(nums) -- 原位排序,无返回值
print("数字升序:", table.concat(nums, ", ")) -- 输出:1, 2, 5, 7, 9
-- 字符串排序(按字符编码,中文按 Unicode 编码)
local fruits = {"香蕉", "苹果", "橙子", "葡萄"}
table.sort(fruits)
print("字符串排序:", table.concat(fruits, ", ")) -- 输出:橙子, 苹果, 葡萄, 香蕉
-- 示例1:数字降序排序
local nums = {5, 2, 9, 1, 7}
table.sort(nums, function(a, b)
-- a > b 时返回 true → a 排在 b 前面(降序)
return a > b
end)
print("数字降序:", table.concat(nums, ", ")) -- 输出:9, 7, 5, 2, 1
-- 示例2:按字符串长度排序
local words = {"lua", "python", "java", "c"}
table.sort(words, function(a, b)
-- 长度短的排在前面
return #a < #b
end)
print("按长度排序:", table.concat(words, ", ")) -- 输出:c, lua, java, python
-- 示例3:按表的自定义属性排序(复杂数据)
local students = {
{name = "张三", score = 85},
{name = "李四", score = 92},
{name = "王五", score = 78}
}
-- 按分数降序排序
table.sort(students, function(a, b)
return a.score > b.score
end)
-- 打印排序结果
for i, s in ipairs(students) do
print(i, s.name, s.score)
end
-- 输出:
-- 1 李四 92
-- 2 张三 85
-- 3 王五 78
os库
获取系统信息、执行系统命令、处理时间等
print(os.date("%Y-%m-%d %H:%M:%S")) -- 当前时间 → 2026-01-04 12:00:00
print(os.time()) -- 时间戳(秒)→ 1735996800
print(os.date("%Y-%m-%d %H:%M:%S", 1767882504)) -- 将时间戳转换为时间字符串
print(os.getenv("PATH")) -- 获取环境变量
os.execute("chcp 65001") -- 解决windows执行命令输出乱码问题
os.execute("dir") -- 执行系统命令(Linux)/ dir(Windows)
os.exit(0) -- 退出程序(0=正常退出)
io库
处理文件的读写、打开 / 关闭,分为 “简单 IO” 和 “文件句柄 IO”:
local io = require("io")
-- 1. 简单IO(一次性读写)
--print("请输入:")
io.write("请输入:") -- print默认是有一个换行的
io.flush()
data = io.read()
print("你输入的内容:", data)
-- 2. 文件句柄IO(推荐,可控性强)
local f = io.open("test.txt", "w") -- 打开文件(w=写入,r=读取,a=追加)
if f then
f:write("hello lua\n") -- 写入内容
f:close() -- 关闭文件
end
-- 读取文件
local f = io.open("test.txt", "r")
if f then
local content = f:read("*a") -- 读取所有内容
print(content) -- 输出:hello lua
f:close()
end
io.read() 的参数主要是模式字符串,分为 “通配符模式” 和 “数字模式” 两类,先讲最常用的通配符模式:
| 参数(模式) | 含义 | 示例场景 |
|---|---|---|
"*l" |
读取一行(默认模式),不包含末尾的换行符;遇到文件尾返回 nil |
读取用户输入的一行文本 |
"*L" |
读取一行,包含末尾的换行符;遇到文件尾返回 nil 5.3才有 |
保留换行符的文本读取 |
"*a" |
读取全部内容(从当前位置到文件尾),适合读取小文件 | 一次性读取整个文件内容 |
"*n" |
读取一个数字(整数 / 浮点数),自动跳过开头的空白字符;非数字返回 nil |
读取用户输入的数字 |
增强内置库
如果你直接在官网下载的lua可执行文件,内置库你就只能用上面那些
如果你是用的一键安装的那种,那么会有很多库可以用,比如json、re、socket
json库
local json = require("json")
--表转json
user = {
name="fengfeng",
age=12,
info={
addr="长沙"
}
}
json_str = json.encode(user)
print(json_str) -- {"info":{"addr":"长沙"},"name":"fengfeng","age":12}
--json转表
tb = json.decode('{"info":{"addr":"长沙"},"name":"fengfeng","age":12}')
print(tb.name) -- fengfeng
print(tb.info.addr) -- 长沙
re正则库
re = require("rex_pcre")
-- 忽略大小写
print(re.match("abcd", "abcd"))
print(re.match("ABCD", "abcd", 0, "i"))
print(re.match("ABCD", "(?i)abcd"))
-- 匹配 "姓名:年龄" 格式,分组提取姓名和年龄
local str = "张三:25\n李四:30"
local name, age = re.match(str, "(\\S+?):(\\d+)")
print(name, age) -- 张三 25
-- 全局匹配
local str = "联系信息:13812345678(手机),test@example.com(邮箱),123456(无效),abc@def(无效)"
local pattern = "((\\d{11})|([\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}))"
-- 全局迭代匹配所有符合规则的内容
print("匹配到的有效联系信息:")
for data, _, _ in re.gmatch(str, pattern) do
print("data:", data)
end
--非贪婪模式
local str = "<DIV>张三</div><p>李四</P><span>王五</span>"
-- 正则说明:
-- <([a-z]+)> :匹配标签名(如div、p),分组1
-- (.*?) :非贪婪匹配标签内的文本(避免匹配到最后一个</>)
-- </\\1> :匹配闭合标签(\\1引用分组1的标签名,保证前后标签一致)
-- i :模式修饰符(忽略大小写)
local pattern = "(?i)<([a-z]+)>(.*?)</\\1>" -- 修饰符写在pattern末尾
print("\n匹配到的标签内容:")
for tag, content in re.gmatch(str, pattern) do
print("标签:", tag, "内容:", content)
end
--正则分隔
local str = "张三123-李四456;王五789,赵六000"
local split_iter = re.split(str, "[-;,]")
print("遍历迭代器获取分割结果:")
for part in split_iter do
print(part)
end
string增强库
这个地方有的人会有误解,为什么不能直接require用
因为这种增强库是以扩展原库的方式扩展的
require("strbuf")
require("list")
require("string_ext")
print(string.split("1,2,3,4,5", ",")) -- {1=1,2=2,3=3,4=4,5=5}
print(string.trim(" 前后都有空格 ")) -- 前后都有空格
table增强库
require("table_ext")
t1 = table.sort({1, 5, 3, 2, 4}) -- 默认升序
for i, v in ipairs(t1) do
io.write(v .. "\t")
end
print()
t2 = table.sort({1, 5, 3, 2, 4}, function(a, b)
return a > b -- 降序
end)
for i, v in ipairs(t2) do
io.write(v .. "\t")
end
print()
print(table.size(t2)) -- 5
-- 获取索引
user = {
name="fengfeng", age=12
}
keys = table.indices(user)
for _, v in pairs(keys) do
print(v)
end
-- clone
u1 = table.clone(user)
u1.name="zhangsan"
print(u1.name)
print(user.name)