| 
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 库的常用函数及其使用方法。这些函数提供了强大的正则表达式功能,帮助开发者高效地进行字符串匹配、查找和替换。  |