Lua有7種數據類型,分別是nil、boolean、number、string、table、function、userdata。這裏我總結一下Lua的string類型和string庫,複習一下,以便加深記憶。html
我的認爲string是Lua編程使用數據結構的時候,重要性僅次於table的類型。十分重要!java
1、string基礎。git
Lua並無字符類型,Lua的string類型表示字符序列。因此,長度爲1的string就表示了單個字符。Lua的字符類型有這些特徵:github
一、string字符序列中的字符采用徹底8位編碼,便可以存聽任何二進制數據。macos
二、string是不可變的值。至關於java中的String類。每次修改都會返回一個新的string,而原有的string保持不變。如:編程
a = "abc" b = a a = "cba" print(a) -->cba print(b) -->abc
三、string的字面值,用匹配的單引號、雙引號括起來都行。同時跟其餘語言同樣能夠用反斜槓「\」的轉義序列。如:數組
c = ‘abc\ndef’ print(c) -->輸出換行了
四、能夠經過<轉義符「\」+數值>來指定字符串中的字符,數值爲最多3位數組成的序列。如:數據結構
d = "\97\98c" print(d) --abc
五、能夠用一對[[XXX]]來界定一個字符串XXX。字符串能夠爲任意字符。如:app
e = [[it's mine! it's not yours! --'Oh' --"Wow!!!!" ]] print (e) --輸出[[]]裏面的全部內容
六、如上的表示有一個bug,就是當字符串包含[[或]]子串的時候,會表達錯誤。Lua提供了[===[XXX]===]這樣的形式來包含字符串XXX。其中,兩邊中括號之間的「=」數量要匹配。如:函數
f = [==[abc[=]defgh[[=]]]==] print(f) --abc[=]defgh[[=]]
七、Lua提供運行時數字和字符的自動轉換。即一個數字和一個字符串相加,Lua會嘗試把這個字符串轉換成數字再求值。不須要咱們顯式轉換。如:
print("5"+6) --11 print("5e-2"+3) --3.05
八、長度操做符「#」,可用於求字符串的長度,即字符串包含的字符數。如:
print(#"abcd\n") --5 str = "abc" print(#str) --3
2、string庫
(科普一下,估計有很多Lua初學者跟我同樣第一次看到Lua的API的時候都會很奇怪,像string.byte (s [, i [, j]])裏面這些「[]」都是些什麼來的?呵呵,中括號表明可選的參數。
就是說,能夠這樣調用:string.byte("abc"),也能夠這樣調用:string.byte("abc",1),固然也能夠這樣調用:string.byte ("abc",1,-1);)
API的詳細解釋不用重複造輪子了吧,雲神已經翻譯了,看這裏,這邊我簡要解釋一下。
一、string.byte (s [, i [, j]])
返回字符串的內部數字編碼,i、j爲字符串的索引,i、j限定了多少字符就返回多少值。以下:
k1,k2,k3 = string.byte("abcdef",1,3) print (k1,k2,k3) --97 98 99
二、string.char (···)
跟byte()相反,把數字編碼轉換爲字符串。以下:
s = string.char(97,98,99) print(s) --abc n = string.char() print(n) --什麼都沒輸出 print(type(n)) --string print(string.char(string.byte("hello",1,-2))) --hell
三、string.dump (function [, strip])
這個函數是用來序列化函數的。傳入一個函數,返回一個字符串。經過load該字符串能夠反序列化該函數。用法以下:
function max( a,b ) return a>b and a or b end --序列化 du = string.dump(max) print(type(du)) --string print(du) --LuaQ --反序列化 max2 = load(du) --調用函數 print(max2(1,2)) --2
四、string.find (s, pattern [, init [, plain]])
這個函數如其名,用來查找匹配的pattern,返回該pattern的索引。找到一個匹配就返回。若是找不到,返回空。以下:
txt = "it's very very good!" i ,j = string.find(txt, "very") print(i,j) --6 9 i ,j = string.find(txt, "big") print(i,j) --nil nil
五、string.format (formatstring, ···)
這個函數用來格式化字符串。API文檔很複雜,用法不少,可查看文檔。以下:
print(string.format("i want %d apples", 5)) --i want 5 apples
六、string.match (s, pattern [, init])
這個函數與find()函數相似,不一樣的是,find返回匹配的索引,這個函數返回第一個匹配的內容自己,以下:
print(string.format("i want %d apples", 5)) --i want 5 apples
七、string.gmatch (s, pattern)
這個函數基本就是用來配合for循環使用的,返回一個迭代器函數,每次調用這個迭代器函數都會返回一個匹配該字符串的值。
Lua5.3參考手冊裏面的示例很經典了,以下:
s = "hello world from Lua" for w in string.gmatch(s, "%a+") do print(w) --連續輸出每一個單詞 end
八、string.gsub (s, pattern, repl [, n])
這個函數用來進行字符替換的。將每一個匹配的字符串替換成指定的字符串repl。返回替換完畢的字符串和替換的次數。我的以爲這個函數很是有意思。
若repl爲函數則會用匹配到的參數做爲參數調用這個函數,若repl爲table,則會用匹配到的參數做爲鍵去查找這個表。以下:
--字符串 print(string.gsub("i have an apple", "apple", "peach")) --函數 function ff( arg ) print("function arg : " .. arg) end print(string.gsub("my name is qsk", "%a+", ff)) --table t = {} metat = {} metat.__index = function ( table,key ) return "!!" .. key end setmetatable(t, metat) print(string.gsub("my name is qsk", "%a+", t))
測試表的時候,給該表設置了一個元表。輸出以下:
i have an peach 1 function arg : my function arg : name function arg : is function arg : qsk my name is qsk 4 !!my !!name !!is !!qsk 4
匹配字符串中的單詞,匹配了4次因此輸出的第二個參數是4.
九、string.len (s)、string.lower (s)、string.upper (s)
這個兩個函數都太簡單了,一個是求字符串的長度。另外一個是將字符串轉換爲小寫。以下:
print(string.len("abcd")) --4 print(string.lower("MACOS")) --macos print(string.upper("12abAB")) --12ABAB
十、string.rep (s, n [, sep])
這個函數就是用來將某個字符串自我複製連接起來。以下:
print(string.rep("s", 5,"-")) --s-s-s-s-s print(string.rep("ab", 5)) --ababababab
十一、string.reverse (s)
如名,用來反轉字符串,反轉字符串中字符的序列。以下:
print(string.reverse("abcdefg")) --gfedcba
十二、string.sub (s, i [, j])
這個函數就是用來截取字符串。很簡單,以下:
print(string.sub("abcdefg", 3,5)) --cde
咱們能夠看到,Lua的字符串處理實在是很強大。相對於Java的String增長了不少匹配函數,使用起來會方便不少。
關於Lua的string還有一項更強大的功能,那就是Lua的字符串「模式」,用於字符串匹配,具體的用法,參照雲神翻譯的《Lua5.3參考手冊》就行了。