Lua string库整理
string庫提供了字符串處理的通用函數(shù)。 例如字符串查找、子串、模式匹配等。 當在 Lua 中對字符串做索引時,第一個字符從 1 開始計算(而不是 C 里的 0 )。 索引可以是負數(shù),它指從字符串末尾反向解析。 即,最后一個字符在 -1 位置處,等等。
字符串庫中的所有函數(shù)都在表string 中。 它還將其設置為字符串元表的__index 域。 因此,你可以以面向?qū)ο蟮男问绞褂米址瘮?shù)。 例如,string.byte(s,i) 可以寫成 s:byte(i)。
字符串庫假定采用單字節(jié)字符編碼
string.byte(s[,i[,j]])
返回字符串s[i]. s[i+1],...,s[j]的內(nèi)部數(shù)字編碼。i的默認值是1,j的默認值是i
s = 'abc' print(string.byte(s)) print(string.byte(s,2)) print(string.byte(s,2,3)) Output: 97 98 98 99string.char(...)
接收零或更多的整數(shù)。 返回和參數(shù)數(shù)量相同長度的字符串。 其中每個字符的內(nèi)部編碼值等于對應的參數(shù)值。
print(string.char(98, 99, 100)) Output: bcdstring.dump(function)
返回包含有以二進制方式表示的(一個?二進制代碼塊?)指定函數(shù)的字符串。 之后可以用 loadstring 調(diào)用這個字符串獲得 該函數(shù)的副本。
function必須是沒有upvalues的lua函數(shù)。
function dump() print("dump test ") end s = string.dump(dump) print(s) func = loadstring(s) func() Output: LuaQ dump testlua 5.3 有改動
string.find(s, pattern [,init [, plain]])
查找第一個字符串 s 中匹配到的 pattern 如果找到一個匹配,find 會返回 s 中關于它起始及終點位置的索引; 否則,返回?nil。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 默認值為 1 ,同時可以是負值。 第四個可選參數(shù) plain 為?true?時, 關閉模式匹配機制。 此時函數(shù)僅做直接的 “查找子串”的操作, 而 pattern 中沒有字符被看作魔法字符。 注意,如果給定了 plain ,就必須寫上 init。
如果在模式中定義了捕獲,捕獲到的若干值也會在兩個索引之后返回。
local s = "abcdefg" print(string.find(s,"(c)")) print(string.find(s,"(c)"),1, true) Output: 3 3 c 3 1 truestring.format(formatstring, ...)
返回不定數(shù)量參數(shù)的格式化版本, 格式化串為第一個參數(shù)(必須是一個字符串)。 格式化字符串遵循 ISO C 函數(shù) sprintf 的規(guī)則。 不同點在于選項 *, h, L, l, n, p 不支持, 另外還增加了一個選項 q。 q 選項將一個字符串格式化為兩個雙引號括起,對內(nèi)部字符做恰當?shù)霓D義處理的字符串。 該字符串可以安全的被 Lua 解釋器讀回來。 例如,調(diào)用
string.format('%q', 'a string with "quotes" and \n new line')
會產(chǎn)生字符串:
"a string with \"quotes\" and \new line"
E, e, f, G, and g 都期待一個對應的數(shù)字參數(shù)。 選項 c, d, i, o, u, X, and x 則期待一個整數(shù)。 選項 q 期待一個字符串; 選項 s 期待一個沒有內(nèi)嵌零的字符串。
print(string.format("%d, %s", 1, "a")) Output: 1, astring.gmatch(s, pattern)
返回一個迭代器函數(shù)。 每次調(diào)用這個函數(shù)都會繼續(xù)以 pattern 對 s 做匹配,并返回所有捕獲到的值。 如果 pattern 中沒有指定捕獲,則每次捕獲整個 pattern。
對這個函數(shù)來說,模板前開始的 '^' 不會當成錨點。因為這樣會阻止迭代。
s = "hello world from Lua" for w in string.gmatch(s, "%a+") do print(w) end Output: hello world from Luastring.gsub(s, pattern, repl [, n])
將字符串 s 中,所有的(或是在 n 給出時的前 n 個) pattern 都替換成 repl ,并返回其副本。 repl 可以是字符串、表、或函數(shù)。 gsub 還會在第二個返回值返回一共發(fā)生了多少次匹配。 gsub 這個名字來源于?Global SUBstitution?。
如果 repl 是一個字符串,那么把這個字符串作為替換品。 字符?%?是一個轉義符: repl 中的所有形式為 %d?的串表示 第?d?個捕獲到的子串,d?可以是 1 到 9 。 串 %0 表示整個匹配。 串 %% 表示單個 %。
如果 repl 是張表,每次匹配時都會用第一個捕獲物作為鍵去查這張表。
如果 repl 是個函數(shù),則在每次匹配發(fā)生時都會調(diào)用這個函數(shù)。 所有捕獲到的子串依次作為參數(shù)傳入。
任何情況下,模板中沒有設定捕獲都看成是捕獲整個模板。
如果表的查詢結果或函數(shù)的返回結果是一個字符串或是個數(shù)字, 都將其作為替換用串; 而在返回?false?或?nil 時不作替換 (即保留匹配前的原始串)。
-- 匹配字符轉 -- 先匹配hello, %1 為匹配值, 將hello 替換為hello hello -- 匹配world時 同理 print(string.gsub("hello world", "(%w+)", "%1 %1")) print(string.gsub("hello world", "(%w+)", "%0 %0",1)) Output: hello hello world world 2 hello hello world 1 -- 替換函數(shù) print(string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s) print(s) return loadstring(s)() end)) Output: return 4+5 4+5 = 9 1 --表 local t = {name="lua", version="5.3"} print(string.gsub("$name-$version.tar.gz", "%$(%w+)", t)) Output: lua-5.3.tar.gz 2string.len(s)
接收一個字符串,返回其長度。 空串 "" 的長度為 0 。 內(nèi)嵌零也統(tǒng)計在內(nèi),因此 "a\000bc\000" 的長度為 5 。
print(string.len("hello world \0")) Output: 13string.lower(s)
接收一個字符串,將其中的大寫字符都轉為小寫后返回其副本。 其它的字符串不會更改。 對大寫字符的定義取決于當前的區(qū)域設置。
print(string.lower("HeLLo World"))Output: hello worldtring.match(s, pattern [, init])
在字符串 s 中找到第一個能用 pattern匹配到的部分。 如果能找到,match 返回其中的捕獲物; 否則返回?nil?。 如果 pattern 中未指定捕獲, 返回整個 pattern 捕獲到的串。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 它默認為 1 且可以是負數(shù)。
print(string.match("hello world", "(%w+)")) print(string.match("hello world", "(%w+)", -1)) Output: hello dstring.rep(s, n)
返回n個字符串s連在一起的字符串
print(string.rep("abc", 2)) Output: abcabclua 5.3 有改動
string.reverse(s)
返回字符串 s 的翻轉串。
print(string.reverse("abc"))Output: cbastring.sub(s)
返回 s 的子串, 該子串從 i 開始到 j 為止; i 和 j 都可以為負數(shù)。 如果不給出 j ,就當它是 -1 (和字符串長度相同)。 特別是, 調(diào)用 string.sub(s,1,j) 可以返回 s 的長度為 j 的前綴串, 而 string.sub(s, -i) 返回長度為 i的后綴串。
print(string.sub("Hello World", 5)) print(string.sub("Hello World", -3)) Output: o World rldstring.upper(s)
接收一個字符串,將其中的小寫字符都轉為大寫后返回其副本。 其它的字符串不會更改。 對小寫字符的定義取決于當前的區(qū)域設置。
print(string.upper("Hello World"))Output: HELLO WORLD匹配模式
字符類:
字符類?用于表示一個字符集合。 下列組合可用于字符類:
- x:?(這里?x?不能是?魔法字符?^$()%.[]*+-? 中的一員) 表示字符?x?自身。
- .:?(一個點)可表示任何字符。
- %a:?表示任何字母。
- %c:?表示任何控制字符。
- %d:?表示任何數(shù)字。
- %g:?表示任何除空白符外的可打印字符。
- %l:?表示所有小寫字母。
- %p:?表示所有標點符號。
- %s:?表示所有空白字符。
- %u:?表示所有大寫字母。
- %w:?表示所有字母及數(shù)字。
- %x:?表示所有 16 進制數(shù)字符號。
- %x:?(這里的?x?是任意非字母或數(shù)字的字符) 表示字符?x。 這是對魔法字符轉義的標準方法。 所有非字母或數(shù)字的字符 (包括所有標點,也包括非魔法字符) 都可以用前置一個 '%' 放在模式串中表示自身。
-
[set]:?表示?set 中所有字符的聯(lián)合。 可以以 '-' 連接,升序書寫范圍兩端的字符來表示一個范圍的字符集。 上面提到的 %x形式也可以在?set?中使用 表示其中的一個元素。 其它出現(xiàn)在?set?中的字符則代表它們自己。 例如,[%w_] (或 [_%w]) 表示所有的字母數(shù)字加下劃線), [0-7] 表示 8 進制數(shù)字, [0-7%l%-] 表示 8 進制數(shù)字加小寫字母與 '-' 字符。
交叉使用類和范圍的行為未定義。 因此,像 [%a-z] 或 [a-%%] 這樣的模式串沒有意義。
-
[^set]:?表示?set?的補集, 其中?set?如上面的解釋。
所有單個字母表示的類別(%a,%c,等), 若將其字母改為大寫,均表示對應的補集。 例如,%S 表示所有非空格的字符。
如何定義字母、空格、或是其他字符組取決于當前的區(qū)域設置。 特別注意:[a-z] 未必等價于 %l 。
模式條目:
模式條目?可以是
- 單個字符類匹配該類別中任意單個字符;
- 單個字符類跟一個 '*', 將匹配零或多個該類的字符。 這個條目總是匹配盡可能長的串;
- 單個字符類跟一個 '+', 將匹配一或更多個該類的字符。 這個條目總是匹配盡可能長的串;
- 單個字符類跟一個 '-', 將匹配零或更多個該類的字符。 和 '*' 不同, 這個條目總是匹配盡可能短的串;
- 單個字符類跟一個 '?', 將匹配零或一個該類的字符。 只要有可能,它會匹配一個;
- %n, 這里的?n?可以從 1 到 9; 這個條目匹配一個等于?n?號捕獲物(后面有描述)的子串。
- %b_xy_, 這里的?x?和?y?是兩個明確的字符; 這個條目匹配以?x?開始?y?結束, 且其中?x?和?y?保持?平衡?的字符串。 意思是,如果從左到右讀這個字符串,對每次讀到一個?x?就?+1?,讀到一個?y?就?-1, 最終結束處的那個_y_ 是第一個記數(shù)到 0 的?y。 舉個例子,條目 %b() 可以匹配到括號平衡的表達式。
- %f[set], 指?邊境模式; 這個條目會匹配到一個位于?set?內(nèi)某個字符之前的一個空串, 且這個位置的前一個字符不屬于?set。 集合?set?的含義如前面所述。 匹配出的那個空串之開始和結束點的計算就看成該處有個字符 '\0' 一樣。
模式:
模式?指一個模式條目的序列。 在模式最前面加上符號 '^' 將錨定從字符串的開始處做匹配。 在模式最后面加上符號 '$' 將使匹配過程錨定到字符串的結尾。 如果 '^' 和 '$' 出現(xiàn)在其它位置,它們均沒有特殊含義,只表示自身。
捕獲:
模式可以在內(nèi)部用小括號括起一個子模式; 這些子模式被稱為?捕獲物。 當匹配成功時,由?捕獲物?匹配到的字符串中的子串被保存起來用于未來的用途。 捕獲物以它們左括號的次序來編號。 例如,對于模式 "(a(.)%w(%s))" , 字符串中匹配到 "a(.)%w(%s)" 的部分保存在第一個捕獲物中 (因此是編號 1 ); 由 "." 匹配到的字符是 2 號捕獲物, 匹配到 "%s*" 的那部分是 3 號。
作為一個特例,空的捕獲 () 將捕獲到當前字符串的位置(它是一個數(shù)字)。 例如,如果將模式 "()aa()" 作用到字符串 "flaaap" 上,將產(chǎn)生兩個捕獲物: 3 和 5 。
參考鏈接:http://cloudwu.github.io/lua53doc/manual.html
轉載于:https://www.cnblogs.com/DeeLMind/p/7110943.html
總結
以上是生活随笔為你收集整理的Lua string库整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fem求解二维时谐电磁场问题
- 下一篇: 一个完整的schema验证xml的样例