第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您同時也協助 支援 Lua 專案


20.1 – 模式配對函式

字串函式庫中功能最强大的函式是 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, " ", " ")
(請記住,_ 只是一個虛擬變數名稱。)