天天看點

Lua的string和string庫總結

  Lua有7種資料類型,分别是nil、boolean、number、string、table、function、userdata。這裡我總結一下Lua的string類型和string庫,複習一下,以便加深記憶。

個人認為string是Lua程式設計使用資料結構的時候,重要性僅次于table的類型。十分重要!

一、string基礎。

  Lua并沒有字元類型,Lua的string類型表示字元序列。是以,長度為1的string就表示了單個字元。Lua的字元類型有這些特征:

1、string字元序列中的字元采用完全8位編碼,即可以存放任何二進制資料。

2、string是不可變的值。相當于java中的String類。每次修改都會傳回一個新的string,而原有的string保持不變。如:

a = "abc"
b = a
a = "cba"
print(a)        -->cba
print(b)        -->abc      

3、string的字面值,用比對的單引号、雙引号括起來都行。同時跟其他語言一樣可以用反斜杠“\”的轉義序列。如:

c = ‘abc\ndef’            
print(c)        -->輸出換行了          

4、可以通過<轉義符“\”+數值>來指定字元串中的字元,數值為最多3位數組成的序列。如:

d = "\97\98c"
print(d)        --abc      

5、可以用一對[[XXX]]來界定一個字元串XXX。字元串可以為任意字元。如:

e = [[it's mine!
it's not yours! --'Oh'   --"Wow!!!!"
]]
print (e)        --輸出[[]]裡面的所有内容      

6、如上的表示有一個bug,就是當字元串包含[[或]]子串的時候,會表達錯誤。Lua提供了[===[XXX]===]這樣的形式來包含字元串XXX。其中,兩邊中括号之間的“=”數量要比對。如:

f = [==[abc[=]defgh[[=]]]==]
print(f)        --abc[=]defgh[[=]]      

7、Lua提供運作時數字和字元的自動轉換。即一個數字和一個字元串相加,Lua會嘗試把這個字元串轉換成數字再求值。不需要我們顯式轉換。如:

print("5"+6)        --11
print("5e-2"+3)        --3.05      

8、長度操作符“#”,可用于求字元串的長度,即字元串包含的字元數。如:

print(#"abcd\n")    --5
str = "abc"
print(#str)            --3      

二、string庫

  (科普一下,估計有不少Lua初學者跟我一樣第一次看到Lua的API的時候都會很奇怪,像string.byte (s [, i [, j]])裡面這些“[]”都是些什麼來的?呵呵,中括号代表可選的參數。

就是說,可以這樣調用:string.byte("abc"),也可以這樣調用:string.byte("abc",1),當然也可以這樣調用:string.byte ("abc",1,-1);)

  API的詳細解釋不用重複造輪子了吧,雲神已經翻譯了,看這裡,這邊我簡要解釋一下。

  1、string.byte (s [, i [, j]])

  傳回字元串的内部數字編碼,i、j為字元串的索引,i、j限定了多少字元就傳回多少值。如下:

k1,k2,k3 = string.byte("abcdef",1,3)
print (k1,k2,k3)    --97    98    99      

  2、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      

  3、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      

  4、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        

  5、string.format (formatstring, ···)

  這個函數用來格式化字元串。API文檔很複雜,用法很多,可檢視文檔。如下:

print(string.format("i want %d apples", 5))    --i want 5 apples      

  6、string.match (s, pattern [, init])

  這個函數與find()函數類似,不同的是,find傳回比對的索引,這個函數傳回第一個比對的内容本身,如下:

print(string.format("i want %d apples", 5))    --i want 5 apples      

  7、string.gmatch (s, pattern)

  這個函數基本就是用來配合for循環使用的,傳回一個疊代器函數,每次調用這個疊代器函數都會傳回一個比對該字元串的值。

  Lua5.3參考手冊裡面的示例很經典了,如下:

s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
    print(w)    --連續輸出每個單詞
end      

  8、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. 

  9、string.len (s)、string.lower (s)、string.upper (s)

  這個兩個函數都太簡單了,一個是求字元串的長度。另一個是将字元串轉換為小寫。如下:

print(string.len("abcd"))        --4
print(string.lower("MACOS"))    --macos
print(string.upper("12abAB"))    --12ABAB      

  10、string.rep (s, n [, sep])

  這個函數就是用來将某個字元串自我複制連結起來。如下:

print(string.rep("s", 5,"-"))        --s-s-s-s-s
print(string.rep("ab", 5))            --ababababab      

  11、string.reverse (s)

  如名,用來反轉字元串,反轉字元串中字元的序列。如下:

print(string.reverse("abcdefg"))        --gfedcba      

  12、string.sub (s, i [, j])

  這個函數就是用來截取字元串。很簡單,如下:

print(string.sub("abcdefg", 3,5))        --cde      

  我們可以看到,Lua的字元串處理實在是很強大。相對于Java的String增加了很多比對函數,使用起來會友善很多。

  關于Lua的string還有一項更強大的功能,那就是Lua的字元串“模式”,用于字元串比對,具體的用法,參照雲神翻譯的《Lua5.3參考手冊》就好了。

/**

*   ————————如果覺得本博文還行,别忘了推薦一下哦,謝謝!

*   作者:錢書康

*   歡迎轉載,請保留此段聲明。

*   出處:http://www.cnblogs.com/zrtqsk/

*/