Lua正則表達式詳解

一、基本語法

正則表達式是用來對字元串模式進行匹配和替換的工具。對於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&lg;")
  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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CFTFW的頭像CFTFW
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相關推薦

  • Python正則表達式search()和match()有什麼區別?

    search()和match()都是Python中的正則表達式函數,它們的作用都是在一個字元串中搜索匹配正則表達式的位置,但它們有著不同的使用場景和返回結果。 一、search()…

    編程 2025-04-29
  • LuaEP:一款強大的Lua開發框架

    LuaEP是一個集成了可以快速開發web應用程序所需的組件的Lua開發框架。它以Lua語言為基礎,提供了許多常用介面和庫,使得開發者不需要從頭開始編寫web應用程序,而是專註於業務…

    編程 2025-04-28
  • MySQL正則表達式替換

    MySQL正則表達式替換是指通過正則表達式對MySQL中的字元串進行替換。在文本處理方面,正則表達式是一種強大的工具,可以方便快捷地進行字元串處理和匹配。在MySQL中,可以使用正…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論