第一版是針對 Lua 5.0 編寫的。儘管對後續版本而言,內容仍有很大的相關性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店買到。
購買本書,您同時也協助 支援 Lua 專案


20 – 字串函式庫

原始 Lua 解譯器處理字串的能力相當有限。程式可以建立字串文字並將它們串接起來。但它無法擷取子字串、檢查其大小或檢查其內容。Lua 中處理字串的完整能力來自於其字串函式庫。

字串函式庫中的一些函式非常簡單:string.len(s) 會傳回字串 s 的長度。string.rep(s, n) 會傳回字串 s 重複 n 次。您可以使用 string.rep("a", 2^20) 建立一個 1MB 的字串(例如,用於測試)。string.lower(s) 會傳回 s 的一份拷貝,其中大寫字母已轉換為小寫;字串中的所有其他字元都不會變更(string.upper 會轉換為大寫)。作為一個典型的用法,如果您想不分大小寫地排序一個字串陣列,您可以寫一些類似於

    table.sort(a, function (a, b)
      return string.lower(a) < string.lower(b)
    end)
string.upperstring.lower 都會遵循目前的區域設定。因此,如果您使用歐洲拉丁文-1 區域設定,則下列表達式
    string.upper("ação")
會產生 "AÇÃO"

呼叫 string.sub(s,i,j) 會從字串 s 中擷取一段,從第 i 個字元到第 j 個字元(包含)。在 Lua 中,字串的第一個字元索引為 1。您也可以使用負索引,從字串的結尾開始算起:索引 -1 指的是字串中的最後一個字元,-2 指的是前一個字元,以此類推。因此,呼叫 string.sub(s, 1, j) 會取得字串 s 的長度為 j字首string.sub(s, j, -1) 會取得字串的字尾,從第 j 個字元開始(如果您沒有提供第三個引數,它會預設為 -1,因此我們可以將最後一個呼叫寫成 string.sub(s, j));而 string.sub(s, 2, -2) 會傳回字串 s 的一份拷貝,其中已移除第一個和最後一個字元

    s = "[in brackets]"
    print(string.sub(s, 2, -2))   -->  in brackets

請記住,Lua 中的字串是不可變的。string.sub 函數與 Lua 中的其他函數一樣,不會變更字串的值,而是會傳回新的字串。常見的錯誤是寫出類似下列內容

    string.sub(s, 2, -2)
並假設 s 的值會被修改。如果您要修改變數的值,您必須將新值指定給變數
    s = string.sub(s, 2, -2)

string.charstring.byte 函數會在字元及其內部數字表示之間進行轉換。函數 string.char 會取得零個或多個整數,將每個整數轉換為字元,並傳回串接所有這些字元的字串。函數 string.byte(s, i) 會傳回字串 s 中第 i 個字元的內部數字表示;第二個引數是選用的,因此呼叫 string.byte(s) 會傳回 s 中第一個 (或單一) 字元的內部數字表示。在下列範例中,我們假設字元以 ASCII 表示

    print(string.char(97))                    -->  a
    i = 99; print(string.char(i, i+1, i+2))   -->  cde
    print(string.byte("abc"))                 -->  97
    print(string.byte("abc", 2))              -->  98
    print(string.byte("abc", -1))             -->  99
在最後一行中,我們使用負索引來存取字串的最後一個字元。

函數 string.format 是在格式化字串時強大的工具,通常用於輸出。它會傳回其可變數目引數的格式化版本,遵循其第一個引數 (即所謂的格式字串) 所提供的說明。格式字串的規則類似於標準 C 的 printf 函數:它由一般文字和指令組成,指令會控制每個引數在格式化字串中放置的位置和方式。簡單的指令是字元 `%´ 加上一個字母,說明如何格式化引數:`d´ 表示十進位數字,`x´ 表示十六進位,`o´ 表示八進位,`f´ 表示浮點數,`s´ 表示字串,以及其他變體。在 `%´ 和字母之間,指令可以包含其他選項,用於控制格式的詳細資訊,例如浮點數的小數位數

    print(string.format("pi = %.4f", PI))     --> pi = 3.1416
    d = 5; m = 11; y = 1990
    print(string.format("%02d/%02d/%04d", d, m, y))
      --> 05/11/1990
    tag, title = "h1", "a title"
    print(string.format("<%s>%s</%s>", tag, title, tag))
      --> <h1>a title</h1>
在第一個範例中,%.4f 表示小數點後有四位數的浮點數。在第二個範例中,%02d 表示十進位數字 (`d´),至少有兩個位數且以零填滿;指令 %2d (不含零) 會使用空白填滿。如需這些指令的完整說明,請參閱 Lua 參考手冊。或者,更好的方法是參閱 C 手冊,因為 Lua 會呼叫標準 C 函式庫來執行這裡的繁重工作。