lua内置库
lua内置的库,直接require就可以用 math库 --取整 print(math.floor(3.9)) -- 向下取整 3 print(math.ceil(3.1)) -- 向上取整 4

lua内置库

发布时间:2026-01-08 (2026-01-08)

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)