Lua 常用库系列:第八篇【正则表达式库】 正则表达式是一种强大的字符串处理工具,用于匹配、查找和替换字符串中的模式。Lua 提供了内置的 string 库支持基本的正则表达式功能,但功能有限。为了更强大的正则表达式支持,可以使用 lrexlib 库。本文将详细介绍 Lua 的正则表达式库及其常用函数和使用方法。 正则表达式库概述Lua 内置的 string 库提供了基本的模式匹配功能,但功能相对有限。lrexlib 是一个更强大的正则表达式库,支持多种正则表达式引擎(如 PCRE、POSIX 等),提供了更强大的正则表达式功能。 一、lrexlib 安装在使用 lrexlib 之前,需要先安装该库。可以使用 LuaRocks 进行安装: luarocks install lrexlib-pcre安装完成后,即可在 Lua 脚本中引用 lrexlib 库。 二、基本使用lrexlib 库提供了丰富的正则表达式函数,用于模式匹配、查找和替换。以下示例演示如何使用 lrexlib 库进行正则表达式操作: 1. 引用库 local rex = require "rex_pcre"2. 匹配字符串 local pattern = "Lua"
local subject = "Hello, Lua!"
if rex.match(subject, pattern) then
print("匹配成功")
else
print("匹配失败")
end3. 查找字符串 local pattern = "(%a+)"
local subject = "Hello, Lua!"
for match in rex.gmatch(subject, pattern) do
print("找到匹配: " .. match)
end4. 替换字符串 local pattern = "Lua"
local subject = "Hello, Lua!"
local replacement = "World"
local result = rex.gsub(subject, pattern, replacement)
print(result) -- 输出: Hello, World!5. 捕获组 local pattern = "(%a+) (%a+)"
local subject = "Hello Lua"
local match1, match2 = rex.match(subject, pattern)
print("捕获组1: " .. match1) -- 输出: 捕获组1: Hello
print("捕获组2: " .. match2) -- 输出: 捕获组2: Lua三、实用小工具在正则表达式操作过程中,一些实用的小工具函数可以提高开发效率。以下是两个常用的小工具函数示例: local rex = require "rex_pcre"
function isValidEmail(email)
local pattern = "^[A-Za-z0-9%.%-_]+@[A-Za-z0-9%.%-_]+%.[A-Za-z]+$"
return rex.match(email, pattern) ~= nil
end
print(isValidEmail("test@example.com")) -- 输出: true
print(isValidEmail("invalid-email")) -- 输出: falselocal rex = require "rex_pcre"
function extractUrlParams(url)
local params = {}
local pattern = "([%w_]+)=([%w_]+)"
for key, value in rex.gmatch(url, pattern) do
params[key] = value
end
return params
end
local url = "http://example.com/?name=Lua&version=5.3"
local params = extractUrlParams(url)
for key, value in pairs(params) do
print(key .. ": " .. value)
end
-- 输出:
-- name: Lua
-- version: 5.3四、综合示例通过组合使用 lrexlib 库,可以实现一个简单的日志文件解析工具。以下是一个示例,演示如何解析日志文件并提取特定信息: 日志文件(log.txt): [2024-06-20 12:34:56] INFO: Server started
[2024-06-20 12:35:00] ERROR: Failed to connect to database
[2024-06-20 12:35:10] INFO: User logged in日志文件解析脚本: local rex = require "rex_pcre"
function parseLogFile(filename)
local logs = {}
local pattern = "%[(.-)%] (%w+): (.+)"
local file = io.open(filename, "r")
if not file then
return nil, "无法打开文件: " .. filename
end
for line in file:lines() do
local timestamp, level, message = rex.match(line, pattern)
if timestamp and level and message then
table.insert(logs, {
timestamp = timestamp,
level = level,
message = message
})
end
end
file:close()
return logs
end
local logs, err = parseLogFile("log.txt")
if logs then
for _, log in ipairs(logs) do
print(string.format("[%s] %s: %s", log.timestamp, log.level, log.message))
end
else
print(err)
end总结本文介绍了 Lua 正则表达式库中的 lrexlib 库的常用函数及其使用方法。这些函数提供了强大的正则表达式功能,帮助开发者高效地进行字符串匹配、查找和替换。 |