lua的字符串操作
lua的字符串絕大部分的操作 都可以用 string 庫函數接口操作,只是因為lua的特性,在匹配操作上會有些不一樣,這個文末會說一點。
另外 lua 的字符串是 從 下標 1 開始的,不是 0 開始。
函數操作:
1. 計算字符串長度
例如:string.len("abcd"); ----> 4
2. 返回字符串 s 的 n 個拷貝
例如:string.rep("abcd",2) ----> abcdabcd
3. 返回字符串的全部大寫
例如:string.upper("AbcD") ----> ABCD
4. 返回字符串的全部小寫
例如:string.lower("AbcD") ----> abcd
5. 字符串的拼接【字符串的格式化操作】
例如:string.format("the value is:%d",4) ----> the value is:4
6. 根據下標截取字符串 這個下標是取的 閉區間長度 ,string.sub(info, index, endindex)
例如:string.sub("abcd",2) ----> bcd
string.sub("abcd",-2) ----> cd
string.sub("abcd",2,-2) ----> bc
string.sub("abcd",2,3) ----> bc
7. 在字符串中查找 string.find()
- 原型:string.find (s, pattern [, init [, plain]])
- 解釋:函數在字符串
s
里查找第一個和參數pattern
匹配的子串,如果找到了一個匹配的子串,就會返回這個子串的起始索引和結束索引,否則就會返回nil
。
另外,參數init
作為一個數字,指定了搜索的起始位置,這個數字默認為1可以一個負數,表示從后往前數的字符個數。
參數plain
作為第四個可選參數默認為flase,傳入參數true表示關閉模式匹配,所以函數只做簡單的查找子串的操作,
如果子串pattern
沒有字符為空字符串""
將會被認為是魔法字符。
如果模式匹配子串被找到了,一個成功被找到的子串將會作為第三個返回值,放在兩個索引返回值的后邊而返回。
- 如果 pattern 匹配模式是 帶有 (...) 就是有括號這種,是捕獲組形式,那find函數會返回匹配到的 字符串 。
- 比如: a,b,str = string.find('qwe123', '(%a+)') ----> 1 3 qwe
- 如果是完全的字符串查找,沒有正則匹配,例如: string.sub("abcd",2) ----> bcd
string.sub("abcd",-2) ----> cd
string.sub("abcd",2,-2) ----> bc
string.sub("abcd",2,3) ----> bc
8. 在字符串中查找並替換 string.gsub(mainString,pattern,replaceString,num)
在字符串中替換。mainString 為要操作的字符串, pattern為被替換的字符,replaceString 要替換的字符,num 替換次數(可以忽略,則全部替換)
例如:string.gsub("abcdabcd","a","z"); ----> zbcdzbcd 2
string.gsub("aaaa","a","z",3); ----> zzza 3
9. 返回字符串的ASCII碼 string.byte()
例如:string.byte("ABCD",4) ----> 68
10. 將ASCII碼變成 字符串 string.char()
例如:string.char(97,98,99,100) ----> abcd
11. 分割字符串 string.split(要分割的字符串, 分隔符)
例如:local result = string.split("1,2,3", ",") ----> result = {"1", "2", "3"}
12. 字符串反轉 string.reverse(s)
例如:string.reverse("jayden") ----> nedyaj
13. 字符串匹配 string.match (s, pattern)
string.find()
要返回匹配字符的索引,也不同於string.gmatch()
函數會返回一個迭代函數可以取到所有的匹配項,
- 原型:string.match(s, pattern [, init])
- 解釋:在字符串
s
中查找滿足參數pattern
的匹配子串,如果找到了一個匹配就返回這個匹配子串,若沒找到則返回nil
,如果參數pattern
沒有指定匹配參數,則返回整個匹配字符串,另外,一個數字形參數init
用來指定查找字符串的其實位置,這個參數默認為1,當然也可以設置為負數,即-n
表示從字符串尾部向前數n個字符開始查找。 - pattern 可以 是 正則匹配 字符串,那 這個函數返回的就是 能匹配到的 字符串。
match_ret = string.match(
ehre99wj=--=-*-/4mdqwl\0ds123fef
, "%d%d%d") ---> 123
14. 字符串匹配迭代返回 string.gmatch (s, pattern)
匹配字符串s中的pattern , 返回一個迭代器函數, 每次調用該迭代器函數,返回下一個子串。
字符串拼接【字符串格式化】
%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(浮點數轉義符, 如%.nf)則設定該浮點數的小數只保留n位, 若后接s(字符串轉義符, 如%.ns)則設定該字符串只顯示前n位.
例如
string.format("%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
匹配用到的基本模式串 模式匹配函數 string.find, string.gmatch, string.gsub, string.match
.(點): 與任何字符配對 %a: 與任何字母配對 %c: 與任何控制符配對(例如\n) %d: 與任何數字配對 %l: 與任何小寫字母配對 %p: 與任何標點(punctuation)配對 %s: 與空白字符配對 %u: 與任何大寫字母配對 %w: 與任何字母/數字配對 %x: 與任何十六進制數配對 %z: 與任何代表0的字符配對 [數個字符類]: 與任何[]中包含的字符類配對. 例如[%w_]與任何字母/數字, 或下划線符號(_)配對 [^數個字符類]: 與任何不包含在[]中的字符類配對. 例如[^%s]與任何非空白字符配對
當上述的字符類用大寫書寫時, 表示與非此字符類的任何字符配對. 例如, %S表示與任何非空白字符配對.例如,'%A'非字母的字符:
轉義字符%
%轉義字符string.find("abc%..","%%")4 4
string.find("abc..d","%.%.")4 5
用"()"進行捕獲
string.find("ab12","(%d%d)")3 4 12
-表示0個或多個,匹配最少個string.find("zzxyyy","(xy-)") 3 3 x
string.find("zzzyyy","(x-y)") 4 4 y
*表示0個或多個,匹配最多個string.find("mmmnnn","(m*n)")1 4 mmmb
string.find("lllnnn","(m*n)") 4 4 n
?表示0個或1個 string.find("aaabbb","(a?b)") 3 4 ab
string.find("cccbbb","(a?b)") 4 4 b