第一版是針對 Lua 5.0 編寫的。儘管對後續版本而言,內容仍有很大的相關性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店買到。
購買本書,您同時也協助 支援 Lua 專案。
![]() |
程式設計 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.upper
和 string.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.char
和 string.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 函式庫來執行這裡的繁重工作。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |