Lua模式匹配

2021-09-08 13:50:33 字數 4543 閱讀 4869

模式匹配函式

在string庫中功能最強大的函式是:

string.find(字串查詢)

string.gsub(全域性字串替換)

string.gfind(全域性字串查詢)

string.gmatch(返回查詢到字串的迭代器)

這些函式都是基於模式匹配的。與其他指令碼語言不同的是,lua並不使用posix規範的正規表示式[4](也寫作regexp)來進行模式匹配。主要的原因出於程式大小方面的考慮:實現乙個典型的符合posix標準的regexp大概需要4000行**,這比整個lua標準庫加在一起都大。權衡之下,lua中的模式匹配的實現只用了500行**,當然這意味著不可能實現posix所規範的所有更能。然而,lua中的模式匹配功能是很強大的,並且包含了一些使用標準posix模式匹配不容易實現的功能。

string.gmatch(str, pattern)      

這是乙個返回迭代器的函式. 實際的用例如下:

s = "hello world from lua"

for w in string.gmatch(s, "%a+") do

print(w)

end這裡是乙個捕獲並將配對字元分別存到不同變數的例子:

t = {}

s = "from=world, to=lua"

for k, v in string.gmatch(s, "(%w+)=(%w+)") do

t[k]=v

endfor k, v in pairs(t) do

print(k, v)

endstring.gsub(str, pattern, repl, n)

string.gsub()函式根據給定的配對表示式對源字串str進行配對, 同時返回源字串的乙個副本, 該副本中成功配對的所有子字串都將被替換. 函式還將返回成功配對的次數.實際的替換行為由repl引數的型別決定:

當repl為字串時, 所有成功配對的子字串均會被替換成指定的repl字串.

當repl為table時, 對每個成功配對的子字串, 函式均會試圖尋找以其為key值的table中的元素, 並返回該元素. 如果該配對包含任何捕獲資訊, 則以編號為1號的捕獲作為key值進行查詢.

當repl為函式時, 每個成功配對的子字串均會作為引數被傳入到該函式中去.

在repl是table或函式時, 如果該table或函式返回了字串或數字的值, 這個值依然會被用於替換副本字串中的配對子字串. 如果該table/函式返回的值為空, 將不發生替換.

n引數可選, 當它被指定時, string.gsub()函式只對源字串中的前n個成功配對的成員進行操作.

以下是幾個例子:

> print(string.gsub("hello world", "(%w+)", "%1 %1"))

hello hello world world 2

> print(string.gsub("hello lua", "(%w+)%s*(%w+)", "%2 %1"))

lua hello 1

> string.gsub("hello world", "%w+", print)

hello world 2

> lookuptable =

> print(string.gsub("hello world", "(%w+)", lookuptable))

hola mundo 2

string.match(str, pattern, init)

string.match()只尋找源字串str中的第乙個配對. 引數init可選, 指定搜尋過程的起點, 預設為1.

在成功配對時, 函式將返回配對表示式中的所有捕獲結果; 如果沒有設定捕獲標記, 則返回整個配對字串. 當沒有成功的配對時, 返回nil.

string.match("abcdaef", "a")

-> a

string.reverse(str)

返回乙個字串的倒序排列

string.reverse("abcde")

->edcba

string.dump(function)

返回指定函式的二進位制**(函式必須是乙個lua函式,並且沒有上值)

string.find(str, pattern, init, plain) 

string.find的基本應用就是用來在目標串(subject string)內搜尋匹配指定的模式的串。函式如果找到匹配的串返回他的位置,否則返回nil.最簡單的模式就是乙個單詞,僅僅匹配單詞本身。比如,模式'hello'僅僅匹配目標串中的"hello"。當查詢到模式的時候,函式返回兩個值:匹配串開始索引和結束索引。

s = "hello world"

string.find(s, "hello")    --> 1    5

string.find(s, "world")    --> 7    11

string.find(s, "l")        --> 3    3

string.find(s, "lll")      --> nil

string.find函式第三個引數是可選的:標示目標串中搜尋的起始位置。當我們想查詢目標串中所有匹配的子串的時候,這個選項非常有用。我們可以不斷的迴圈搜尋,每一次從前一次匹配的結束位置開始。下面看乙個例子,下面的**用乙個字串中所有的新行構造乙個表:

local t = {}      -- 存放回車符的位置

local i = 0

while true do

i = string.find(s, "\n", i+1)  -- 查詢下一行

if i == nil then break end

table.insert(t, i)

endstring.sub(str,spos,epos)

string.gsub的功能是擷取字串,他從指定起始位置擷取乙個字串。string.sub可以利用string.find返回的值擷取匹配的子串。

對簡單模式而言,匹配的就是其本身

s = "hello world"

local i, j = string.find(s, "hello")    --> 1    5

string.sub(s, i, j)        --> hello

string.gsub(str, sourcestr, desstr)

string.gsub的基本作用是用來查詢匹配模式的串,並將使用替換串其替換掉:

string.gsub函式有三個引數:目標串,模式串,替換串。

s = string.gsub("lua is cute", "cute", "great")

print(s)      --> lua is great

s = string.gsub("all lii", "l", "x")

print(s)      --> axx xii

s = string.gsub("lua is great", "perl", "tcl")

print(s)      --> lua is great

第四個引數是可選的,用來限制替換的範圍:

s = string.gsub("all lii", "l", "x", 1)

print(s)          --> axl lii

s = string.gsub("all lii", "l", "x", 2)

print(s)          --> axx lii

string.gsub的第二個返回值表示他進行替換操作的次數。例如,下面**湧來計算乙個字串中空格出現的次數:

_, count = string.gsub(str, " ", " ")

(注意,_ 只是乙個啞元變數)

模式你還可以在模式串中使用字元類。字元類指可以匹配乙個特定字元集合內任何字元的模式項。比如,字元類%d匹配任意數字。所以你可以使用模式串'%d%d/%d%d/%d%d%d%d'搜尋dd/mm/yyyy格式的日期:

s = "deadline is 30/05/1999, firm"

date = "%d%d/%d%d/%d%d%d%d"

print(string.sub(s, string.find(s, date)))    --> 30/05/1999

下面的表列出了lua支援的所有字元類:

單個字元(除^$()%.*+-?外): 與該字元自身配對

.(點): 與任何字元配對

%a: 與任何字母配對

%c: 與任何控制符配對(例如\n)

%d: 與任何數字配對

%l: 與任何小寫字母配對

%p: 與任何標點(punctuation)配對

%s: 與空白字元配對

%u: 與任何大寫字母配對

%w: 與任何字母/數字配對

%x: 與任何十六進製制數配對

%z: 與任何代表0的字元配對

%x(此處x是非字母非數字字元): 與字元x配對. 主要用來處理表示式中有功能的字元(^$()%.*+-?)的配對問題, 例如%%與%配對

[數個字元類]: 與任何中包含的字元類配對. 例如[%w_]與任何字母/數字, 或下劃線符號(_)配對

[^數個字元類]: 與任何不包含在中的字元類配對. 例如[^%s]與任何非空白字元配對

Lua模式匹配

模式匹配函式 在string庫中功能最強大的函式是 string.find 字串查詢 string.gsub 全域性字串替換 string.gfind 全域性字串查詢 string.gmatch 返回查詢到字串的迭代器 這些函式都是基於模式匹配的。與其他指令碼語言不同的是,lua並不使用posix規...

Lua模式匹配

模式匹配函式 在string庫中功能最強大的函式是 string.find 字串查詢 string.gsub 全域性字串替換 string.gfind 全域性字串查詢 string.gmatch 返回查詢到字串的迭代器 這些函式都是基於模式匹配的。與其他指令碼語言不同的是,lua並不使用posix規...

lua的模式匹配

原文 lua 的模式匹配不使用posix規範的正規表示式 也寫做regexp 來進行模式匹配。主要的原因出於程式大小方面的考慮 實現乙個典型的符合posix標準的regexp大概需要4000行 這比整個lua標準庫加在一起都大。權衡之下,lua中的模式匹配的實現只用了500行 當然這意味著不可能實現...