--****************Lua的string庫函數****************** --1.string.byte --string.byte (s [, i [, j]]) --取出字符串中的字節.i是起始位置,j是結束位置. --解析協議的時候經常用來將字符串中的某幾個字節取出,然后重新組裝為一個多字節的數字. --2.string.char --string.char (···) --接受若干數字,組成一個字符串,字符串的長度為參數個數.字符串內部的字節和數字對應. --解析協議的時候,經常用來將一個多字節的數字按字節存入字符串. --3.string.dump --string.dump (function) --將一個lua函數作為一個字符串返回.可以用load函數加載這個字符串,返回該函數的拷貝. --4.string.find --string.find (s, pattern [, init [, plain]]) --在字符串s中查找符合pattern的子串,如果找到了返回子串的開始位置和結束位置,否則返回nil --init參數為查找的起始位置,可以為負數. --plain參數為true的話會關閉模式匹配,只進行純字符串匹配. --更多的模式匹配規則會在下面詳細記錄.
--5.string.format --string.format (formatstring, ···) --類似c語言的sprintf函數.返回一個格式化的字符串.區別是string.format不支持 *, h, L, l, n, p 這些模式. 額外支持一個q模式. --q模式會轉義字符串參數中的雙引號.以便可以將字符串重新讀回lua. --模式 A,a (when available), E, e, f, G, g 都對應一個數字參數. --模式 c, d, i, o, u, X, x 也對應一個數字參數, 但是數字所占字節數受限於底層c實現. --模式 o, u, X, x 對應的參數不能為負數. --模式 q 對應一個字符串. --模式 s 對應一個不含 \000 的字符串. 如果對應的不是一個字符串,則按照tostring來. --6.string.gmatch --string.gmatch (s, pattern) --匹配字符串s中的pattern , 返回一個迭代器函數, 每次調用該迭代器函數,返回下一個子串. --pattern中捕獲( 使用小括號() )了幾個內容,則每次返回幾個值. 如果沒有捕獲任何值,則返回整個子串. --7.string.gsub --string.gsub (s, pattern, repl [, n]) --第一個返回值為字符串s的副本, 其中所有(或者前n個)符合模式pattern的子串都被替換為repl. --第二個返回值為替換的次數. --repl 可以為一個字符串,一個table 或者一個函數. --如果repl為一個字符串.則使用這個字符串來替換.repl中,字符%是一個轉義字符.出現在repl中的( %d , 其中d的范圍為1-9)對應符合pattern模式的字串中捕獲的值. --%0代表整個字串. %%代表一個單獨的% --如果repl為一個table. 則每次匹配到字串的時候都會查詢這個table. 使用第一個捕獲的值做為key. --如果repl為一個函數. 則每次匹配到字串的時候都會調用, 依次傳入每個捕獲的值. --如果repl所對應的table或者函數返回的值為一個字符串或者數字,則使用返回值來替換. --如果repl所對應的table或者函數返回的值為false或者nil,則不執行該字串的替換. --8.string.len --string.len (s) --返回字符串的長度. \000 被算進長度 . 因此字符串 "a\000bc\000" 的長度為5 --9.string.lower --string.lower (s) --將字符串中的大寫字符轉換為小寫.
--10.string.match --string.match (s, pattern [, init]) --匹配字符串s中的第一個符合pattern的子串 , 如果找到了 , 返回所有捕獲的值。否則返回nil --如果沒有捕獲任何值,則返回整個字串. --init參數為匹配的起始位置,可以為負數. --11.string.rep --string.rep (s, n [, sep]) --將n個字符串s拼起來, 重復n次 , sep是他們之間的間隔. --12.string.reverse --string.reverse (s) --翻轉字符串 --13.string.sub --string.sub (s, i [, j]) --截取子串.參數i為開始位置,j為結束位置. --i和j都可以為負數. 字符串的起始位置為1,字符串的末尾為-1. --如果經過轉換后,i小於1,i被修正為1. (例如字符串長度為3,i為-4,則實際i到了字符串起始位置之前) --如果經過轉換后,j大於字符串長度,j被修正為字符串長度. --如果經過轉換后,i大於j.則返回一個空串.
--string.sub(-5,10) 開始參數start 為負數,子串的位置從字符串的最后開始計算,--從字符串的倒數第五的位置開始,結束的位置為 從1 的位置開始到10的位置結束
-- **************lua中string的模式匹配******************* --************** 字符集合*************** -- X: X為不包含在特殊字符中的字符,屬於一個普通字符. 代表字符X本身 -- .: 代表所有字符 -- %a: 代表所有字母 -- %c: 代表所有控制字符 -- %d: 代表所有數字(0-9) -- %g: 代表除了空格外的所有可打印字符 -- %l: 代表所有小寫字母 -- %p: 代表所有標點字符 -- %s: 代表所有空白字符 -- %u: 代表所有大寫字母 -- %w: 代表所有包含字母或者數子的字符 -- %x: 代表所有16進制數字(0-F) -- %X: X為所有非字母和數字的字符,代表字符X本身.可以用來轉義特殊字符.所有標點字符(即使不是特殊字符)之前都可以加一個%,代表這個標點本身. -- [set]: 代表[]之間所有字符或者模式的集合. '-'可以用來表示前后兩個字符之間的范圍. 例如 [%w_] 代表所有數字,字母和下划線. -- [0-7] 代表數字0到7 . [0-7%l%-] 代表0到7的數字,所有小寫字母,還有'-', 其中'-'為特殊字符,必須轉義. -- [^set]: 代表[set]的補集 --**********模式************ -- * : 匹配0個或多個字符集合中的字符. 匹配盡可能多的字符 -- + : 匹配1個或多個字符集合中的字符. 匹配盡可能多的字符 -- - : 匹配0個或多個字符集合中的字符. 匹配盡可能少的字符 -- ? : 匹配0個或1個字符集合中的字符. -- %n: 1<=n<=9 , 對應匹配的字串中捕獲的字符串. -- %bxy: 其中x和y是兩個指定的字符. 匹配一個以x開頭,並以y結尾的字符串. x和y是成對匹配的. -- %f[set]: 一種邊界模式,匹配一個空字符,這個空字符的下一個字符屬於集合set,它的前一個字符不屬於集合set. -- ^ : ^在一個pattern的開頭匹配字符串的開始.在pattern的其他位置代表該字符本身. -- $ : $在一個pattern的結尾匹配字符串的結尾.在pattern的其他位置代表該字符本身. --**********捕獲************ -- 一個模式可以包含用括號包含起來的子模式,叫做捕獲. -- 當一個模式被匹配時,捕獲的內容被儲存起來,用作更多用途. -- 捕獲是按照先后來排序的. 例如在模式 "(a*(.)%w(%s*))" 中, "a*(.)%w(%s*)"是捕獲的第一個子模式,"."是第二個,"%s*"是第三個. -- 空捕獲() , 捕獲的是當前子串的開始位置和結束位置的下一個位置, 如果我們在字符串"flaaap"中使用"()aa()"模式來匹配, 那么捕獲的值分別為3和5. print("------------pattern----------------") print( string.match("flaaap" , "()aa()") ) --捕獲匹配子串的位置. print( string.match("fflaaap" , "^f+") ) --匹配開頭的n個f. print( string.match("flaaappp" , "p+$") ) --匹配結尾的n個p print( string.match("xw_2" , "^[%l%d_]+$" ) ) --匹配整個字符串,這個字符串只包含小寫字母,數字,下划線 print( string.match("ynEF8" , "%x+" ) ) --相當於pattern "[a-fA-F0-9]+" -- + 和 - 的區別 print( string.match("hello" , "hel+o" ) ) --都匹配兩個l print( string.match("hello" , "hel-o" ) ) --都匹配兩個l print( string.match("hello" , "hel+" ) ) --匹配兩個l print( string.match("hello" , "hel-" ) ) --匹配0個l --在后面的模式可以匹配更多的時候, - 選擇匹配更少 print( string.match("he3_llo" , "^(%l+)([3_]-)([%l_]+)$" ) ) -- he 3 _llo print( string.match("he3_llo" , "^(%l+)([3_]+)([%l_]+)$" ) ) -- he 3_ llo