一、基本語法
正則表達式是用來對字元串模式進行匹配和替換的工具。對於Lua而言,它包含了兩個主要的函數:string.match和string.gsub。下面我們先看看基礎語法。
local str = "hello, lua regex" -- 匹配 "lua" 字元串 local _, matchStr = string.match(str, "(%a+), (%a+)") print(matchStr) -- 輸出 "lua" -- 替換 "lua" 為 "python" local replacedStr = string.gsub(str, "(%a+), (%a+)", "%1, python") print(replacedStr) -- 輸出 "hello, lua, python"
如上所示,通過使用string.match或string.gsub函數進行匹配或替換。在匹配模式或替換模式中可以使用各種元字元以及轉義字元。其中最常見的元字元包括:字符集合[ ],字元範圍[ – ],重複匹配+、*、?和{}等,同時還有通過()來進行括弧匹配並獲取其中的字元串。
二、元字元詳解
除了進行基本的匹配和替換,正則表達式還包含了許多元字元來輔助我們進行更加靈活的匹配或替換。下面我們來詳細介紹幾個常用的元字元。
1、字符集合 [ ]
字符集合是一個用來描述一組可以匹配的字元的元字元,例如[A-Z]表示匹配大寫字母A到Z中的任意一個字元。除了使用單個字元,也可以使用範圍表示法如:[0-9]表示匹配任意一個數字。
local str = "hello, lua regex" -- 匹配所有小寫字母 local matchedStr = string.match(str, "([a-z]+)") print(matchedStr) -- 輸出 "hello" -- 匹配除了小寫字母之外的其它字元 local replacedStr = string.gsub(str, "([^a-z]+)", "_") print(replacedStr) -- 輸出 "_lua_regex"
2、特殊字元類
正則表達式還包含一些特殊字元類,如\d表示匹配任意一個數字字元,\s表示匹配任意一個空格字元,\w表示匹配任意一個字母或數字,\x表示匹配十六進位數。同時它們都有對應的大寫形式
local str = "hello, lua regex 3" -- 匹配數字字元 local matchedStr = string.match(str, "(\%d+)") print(matchedStr) -- 輸出 "3" -- 替換空格字元 local replacedStr = string.gsub(str, "(\%s+)", "") print(replacedStr) -- 輸出 "hello,luaregex3"
3、重複匹配+、*、?和{}
重複匹配是在正則表達式中對某個字元或某個字符集合進行重複匹配的元字元,其中最常用的是+、*和{}。
其中,+表示匹配前面的字元至少一次,*表示匹配前面的字元任意次數(包括0),?表示匹配前面的字元0次或1次,{n,m}表示匹配前面的字元至少n次,最多m次。
local str = "abc ab abbb abbbb abcde" -- 匹配至少一個b的單詞 local matchedStr = string.match(str, "%w*ab+%w*") print(matchedStr) -- 輸出 "ab", "abbb", "abbbb" -- 匹配至少4個b的單詞 local matchedStr = string.match(str, "%w*ab{4,}%w*") print(matchedStr) -- 輸出 "abbbb"
三、轉義字元
在許多情況下需要匹配一些特殊的字元(如.、+、*、?、(和)等)本身,這時候需要使用轉義字元 \ 來進行轉義匹配。
local str = "3.14" -- 匹配小數點 local matchedStr = string.match(str, "%.") print(matchedStr) -- 輸出 "." -- 替換小數點 local replacedStr = string.gsub(str, "%.", ",") print(replacedStr) -- 輸出 "3,14"
四、使用場景
正則表達式可以在各種場景下使用,如從 HTML 代碼中匹配標籤及其屬性、從日誌中匹配出關鍵字、從郵件地址中取出用戶名及域名等。下面我們來看一些實際應用場景。
1、從 HTML 代碼中匹配標籤及其屬性
local str = "<div id='myid' class='myclass'>Hello, Lua Regex</div>" -- 匹配div標籤及其屬性 local matchedStr = string.match(str, "<div%s+([^>]+)>([^<]+)</div>") print(matchedStr) -- 輸出 "id='myid' class='myclass'", "Hello, Lua Regex" -- 替換div標籤為p標籤 local replacedStr = string.gsub(str, "(<div%s+)([^>]+)(>)", "<p%2≶") replacedStr = string.gsub(replacedStr, "(</div>)", "</p>") print(replacedStr) -- 輸出 "<p id='myid' class='myclass'>Hello, Lua Regex</p>"
2、從日誌中匹配出關鍵字
local str = [[ 2022-01-01 08:01:01 ERROR message: xxxxxx 2022-01-01 08:02:02 DEBUG message: xxxxxx 2022-01-01 08:03:03 WARN message: xxxxxx 2022-01-01 08:04:04 ERROR message: xxxxxx ]] -- 匹配所有錯誤信息 for errorMsg in string.gmatch(str, "%d%d%d%d%-%d%d%-%d%d%s+%d%d:%d%d:%d%d%s+ERROR%s+message:%s+([^%c]+)") do print(errorMsg) end
3、從郵件地址中取出用戶名及域名
local str = "tom@example.com" -- 取出用戶名及域名 local matchedStr = string.match(str, "(%w+)@(%w+%.%w+)") print(matchedStr) -- 輸出 "tom", "example.com"
五、總結
通過本文,我們詳細介紹了Lua正則表達式的基礎語法、元字元及其使用場景。正則表達式對於提取或處理字元串中特定的數據,具有十分重要的作用,希望本文能對大家有所啟發。
原創文章,作者:CFTFW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/334785.html