第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您同時也協助 支援 Lua 專案。
![]() |
用 Lua 程式設計 | ![]() |
第三部分。標準函式庫 第 20 章。字串函式庫 |
字串函式庫中功能最强大的函式是 string.find
(字串尋找)、string.gsub
(全域取代)和 string.gfind
(全域尋找)。它們都基於模式。
與其他多種指令碼語言不同,Lua 不使用 POSIX 正規表示式 (regexp) 來進行模式配對。這樣做的主要原因是大小:POSIX regexp 的典型實作需要超過 4,000 行程式碼。這比所有 Lua 標準函式庫加起來還要大。相比之下,Lua 中的模式配對實作不到 500 行。當然,Lua 中的模式配對無法執行 POSIX 完整實作所能執行的所有功能。儘管如此,Lua 中的模式配對仍然是一個强大的工具,而且包含一些難以使用標準 POSIX 實作來比擬的功能。
string.find
的基本用法是在給定的字串(稱為主旨字串)中搜尋模式。該函式會傳回找到模式的位置,或是在找不到模式時傳回 nil。模式最簡單的形式是一個字詞,它只會比對其自身的複本。例如,模式 'hello
' 會在主旨字串中搜尋子字串 "hello"
。當 find
找到其模式時,它會傳回兩個值:比對開始的索引和比對結束的索引。
s = "hello world" i, j = string.find(s, "hello") print(i, j) --> 1 5 print(string.sub(s, i, j)) --> hello print(string.find(s, "world")) --> 7 11 i, j = string.find(s, "l") print(i, j) --> 3 3 print(string.find(s, "lll")) --> nil當比對成功時,
string.sub
會傳回 string.find
所傳回值的子字串,也就是與模式比對的主旨字串部分。(對於簡單的模式,這會是模式本身。)
string.find
函數有一個可選的第三個參數:一個索引,用於告訴在主體字串中的何處開始搜尋。當我們想要處理給定樣式出現的所有索引時,這個參數很有用。我們重複搜尋新的樣式,每次都從我們找到前一個樣式的位址之後開始。例如,以下程式碼建立一個表格,其中包含字串中所有換行符號的位置
local t = {} -- table to store the indices local i = 0 while true do i = string.find(s, "\n", i+1) -- find 'next' newline if i == nil then break end table.insert(t, i) end我們稍後會看到使用
string.gfind
迭代器撰寫此類迴圈的更簡單方法。
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, " ", " ")(請記住,
_
只是一個虛擬變數名稱。)
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |