lua直譯器對字串的支援很有限。乙個程式可以建立字串並連線字串,但不能擷取子串,檢查字串的大小,檢測字串的內容。在lua中操縱字串的功能基本來自於string庫。
字串庫中的一些函式是非常簡單的:
string.
len(s) 返回字串s的長度;
string.
rep(s, n) 返回重複n次字串s的串;你使用
string.rep
("a", 2^20)可以建立乙個1m bytes的字串(比如,為了測試需要);
string.
lower
(s) 將s中的大寫字母轉換成小寫(
string.upper
將小寫轉換成大寫)。如果你想不關心大小寫對乙個陣列進行排序的話,你可以這樣:
table.sort
(a, function (a, b)
return
string.lower
(a) <
string.lower
(b)end)
string.upper
(s) 將s中的小寫字母轉換成大寫
string.upper
和string.lower
都依賴於本地環境變數。所以,如果你在 european latin-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個字元開始的字尾。如果不提供第3個引數,預設為-1,因此我們將最後乙個呼叫寫為
string.sub
(s, j);
string.sub
(s, 2, -2)返回去除第乙個和最後乙個字元後的子串。
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獲取0個或多個整數,將每乙個數字轉換成字元,然後返回乙個所有這些字元連線起來的字串。
string.byte
(s, i)將字串s的第i個字元的轉換成整數;第二個引數是可選的,預設情況下i=1。下面的例子中,我們假定字元用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
上面最後一行,我們使用負數索引訪問字串的最後乙個字元。
lua提供了string.format()函式來生成具有特定格式的字串, 函式的第乙個引數是格式(formatstring), 之後是對應格式中每個代號的各種資料. 由於格式字串的存在, 使得產生的長字串可讀性大大提高了. 這個函式的格式很像c語言中的printf().函式
string.format
在用來對字串進行格式化的時候,特別是字串輸出,是功能強大的工具。這個函式有兩個引數,你完全可以照c語言的
printf
來使用這個函式。第乙個引數為格式化串:由指示符和控制格式的字元組成。指示符後的控制格式的字元可以為:十進位制'd';十六進製制'x';八進位制'o';浮點數'f';字串's'。在指示符'%'和控制格式字元之間還可以有其他的選項:用來控制更詳細的格式,比如乙個浮點數的小數的位數:
格式字串可能包含以下的轉義碼:
%c - 接受乙個數字, 並將其轉化為ascii碼表中對應的字元
%d, %i - 接受乙個數字並將其轉化為有符號的整數格式
%o - 接受乙個數字並將其轉化為八進位制數格式
%u - 接受乙個數字並將其轉化為無符號整數格式
%x - 接受乙個數字並將其轉化為十六進製制數格式, 使用小寫字母
%x - 接受乙個數字並將其轉化為十六進製制數格式, 使用大寫字母
%e - 接受乙個數字並將其轉化為科學記數法格式, 使用小寫字母e
%e - 接受乙個數字並將其轉化為科學記數法格式, 使用大寫字母e
%f - 接受乙個數字並將其轉化為浮點數格式
%g(%g) - 接受乙個數字並將其轉化為%e(%e, 對應%g)及%f中較短的一種格式
%q - 接受乙個字串並將其轉化為可安全被lua編譯器讀入的格式
%s - 接受乙個字串並按照給定的引數格式化該字串
為進一步細化格式, 可以在%號後新增引數. 引數將以如下的順序讀入:
(1) 符號: 乙個+號表示其後的數字轉義符將讓正數顯示正號. 預設情況下只有負數顯示符號.
(2) 佔位符: 乙個0, 在後面指定了字串寬度時佔位用. 不填時的預設佔位符是空格.
(3) 對齊標識: 在指定了字串寬度時, 預設為右對齊, 增加-號可以改為左對齊.
(4) 寬度數值
(5) 小數字數/字串裁切: 在寬度數值後增加的小數部分n, 若後接f(浮點數轉義符, 如%6.3f)則設定該浮點數的小數只保留n位, 若後接s(字串轉義符, 如%5.3s)則設定該字串只顯示前n位.
在這些引數的後面則是上述所列的轉義碼型別(c, d, i, f, ...).
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", tag, title, tag))
-->
第乙個例子,%.4f代表小數點後面有4位小數的浮點數。第二個例子%02d代表以固定的兩位顯示十進位制數,不足的前面補0。而%2d前面沒有指定0,不足兩位時會以空白補足。對於格式串部分指示符得詳細描述清參考lua手冊,或者參考c手冊,因為lua呼叫標準c的printf函式來實現最終的功能。
以下是一些例子:
string.format("%%c: %c", 83) 輸出s
string.format("%+d", 17.0) 輸出+17
string.format("%05d", 17) 輸出00017
string.format("%o", 17) 輸出21
string.format("%u", 3.14) 輸出3
string.format("%x", 13) 輸出d
string.format("%x", 13) 輸出d
string.format("%e", 1000) 輸出1.000000e+03
string.format("%e", 1000) 輸出1.000000e+03
string.format("%6.3f", 13) 輸出13.000
string.format("%q", "one\ntwo") 輸出"one\
two"
string.format("%s", "monkey") 輸出monkey
string.format("%10s", "monkey") 輸出 monkey
string.format("%5.3s", "monkey") 輸出 mon
**:
Lua中的字串函式庫
lua直譯器對字串的支援很有限。乙個程式可以建立字串並連線字串,但不能擷取子串,檢查字串的大小,檢測字串的內容。在lua中操縱字串的功能基本來自於string庫。字串庫中的一些函式是非常簡單的 string.len s 返回字串s的長度 string.rep s,n 返回重複n次字串s的串 你使用 ...
Lua中的字串函式庫
lua直譯器對字串的支援很有限。乙個程式可以建立字串並連線字串,但不能擷取子串,檢查字串的大小,檢測字串的內容。在lua中操縱字串的功能基本來自於string庫。字串庫中的一些函式是非常簡單的 string.len s 返回字串s的長度 string.rep s,n 返回重複n次字串s的串 你使用 ...
Lua中的字串函式庫
lua直譯器對字串的支援很有限。乙個程式可以建立字串並連線字串,但不能擷取子串,檢查字串的大小,檢測字串的內容。在lua中操縱字串的功能基本來自於string庫。字串庫中的一些函式是非常簡單的 string.len s 返回字串s的長度 string.rep s,n 返回重複n次字串s的串 你使用 ...