string庫提供了字符串處理的通用函數(shù)。 例如字符串查找、子串、模式匹配等。 當(dāng)在 Lua 中對字符串做索引時,第一個字符從 1 開始計算(而不是 C 里的 0 )。 索引可以是負(fù)數(shù),它指從字符串末尾反向解析。 即,最后一個字符在 -1 位置處,等等。
字符串庫中的所有函數(shù)都在表string 中。 它還將其設(shè)置為字符串元表的__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的默認(rèn)值是1,j的默認(rèn)值是i
s = 'abc'
print(string.byte(s))
print(string.byte(s,2))
print(string.byte(s,2,3))
Output:
97
98
98 99
string.char(...)
接收零或更多的整數(shù)。 返回和參數(shù)數(shù)量相同長度的字符串。 其中每個字符的內(nèi)部編碼值等于對應(yīng)的參數(shù)值。
print(string.char(98, 99, 100))
Output:
bcd
string.dump(function)
返回包含有以二進(jìn)制方式表示的(一個 二進(jìn)制代碼塊 )指定函數(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 test
lua 5.3 有改動
string.find(s, pattern [,init [, plain]])
查找第一個字符串 s 中匹配到的 pattern 如果找到一個匹配,find 會返回 s 中關(guān)于它起始及終點位置的索引; 否則,返回 nil。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 默認(rèn)值為 1 ,同時可以是負(fù)值。 第四個可選參數(shù) plain 為 true 時, 關(guān)閉模式匹配機制。 此時函數(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 true
string.format(formatstring, ...)
返回不定數(shù)量參數(shù)的格式化版本, 格式化串為第一個參數(shù)(必須是一個字符串)。 格式化字符串遵循 ISO C 函數(shù) sprintf 的規(guī)則。 不同點在于選項 *, h, L, l, n, p 不支持, 另外還增加了一個選項 q。 q 選項將一個字符串格式化為兩個雙引號括起,對內(nèi)部字符做恰當(dāng)?shù)霓D(zhuǎn)義處理的字符串。 該字符串可以安全的被 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 都期待一個對應(yīng)的數(shù)字參數(shù)。 選項 c, d, i, o, u, X, and x 則期待一個整數(shù)。 選項 q 期待一個字符串; 選項 s 期待一個沒有內(nèi)嵌零的字符串。
print(string.format("%d, %s", 1, "a"))
Output:
1, a
string.gmatch(s, pattern)
返回一個迭代器函數(shù)。 每次調(diào)用這個函數(shù)都會繼續(xù)以 pattern 對 s 做匹配,并返回所有捕獲到的值。 如果 pattern 中沒有指定捕獲,則每次捕獲整個 pattern。
對這個函數(shù)來說,模板前開始的 '^' 不會當(dāng)成錨點。因為這樣會阻止迭代。
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
Output:
hello
world
from
Lua
string.gsub(s, pattern, repl [, n])
將字符串 s 中,所有的(或是在 n 給出時的前 n 個) pattern 都替換成 repl ,并返回其副本。 repl 可以是字符串、表、或函數(shù)。 gsub 還會在第二個返回值返回一共發(fā)生了多少次匹配。 gsub 這個名字來源于 Global SUBstitution 。
如果 repl 是一個字符串,那么把這個字符串作為替換品。 字符 % 是一個轉(zhuǎn)義符: repl 中的所有形式為 %d 的串表示 第 d 個捕獲到的子串,d 可以是 1 到 9 。 串 %0 表示整個匹配。 串 %% 表示單個 %。
如果 repl 是張表,每次匹配時都會用第一個捕獲物作為鍵去查這張表。
如果 repl 是個函數(shù),則在每次匹配發(fā)生時都會調(diào)用這個函數(shù)。 所有捕獲到的子串依次作為參數(shù)傳入。
任何情況下,模板中沒有設(shè)定捕獲都看成是捕獲整個模板。
如果表的查詢結(jié)果或函數(shù)的返回結(jié)果是一個字符串或是個數(shù)字, 都將其作為替換用串; 而在返回 false 或 nil 時不作替換 (即保留匹配前的原始串)。
-- 匹配字符轉(zhuǎn)
-- 先匹配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 2
string.len(s)
接收一個字符串,返回其長度。 空串 "" 的長度為 0 。 內(nèi)嵌零也統(tǒng)計在內(nèi),因此 "a\000bc\000" 的長度為 5 。
print(string.len("hello world \0"))
Output:
13
string.lower(s)
接收一個字符串,將其中的大寫字符都轉(zhuǎn)為小寫后返回其副本。 其它的字符串不會更改。 對大寫字符的定義取決于當(dāng)前的區(qū)域設(shè)置。
print(string.lower("HeLLo World"))
Output:
hello world
tring.match(s, pattern [, init])
在字符串 s 中找到第一個能用 pattern匹配到的部分。 如果能找到,match 返回其中的捕獲物; 否則返回 nil 。 如果 pattern 中未指定捕獲, 返回整個 pattern 捕獲到的串。 第三個可選數(shù)字參數(shù) init 指明從哪里開始搜索; 它默認(rèn)為 1 且可以是負(fù)數(shù)。
print(string.match("hello world", "(%w+)"))
print(string.match("hello world", "(%w+)", -1))
Output:
hello
d
string.rep(s, n)
返回n個字符串s連在一起的字符串
print(string.rep("abc", 2))
Output:
abcabc
lua 5.3 有改動
string.reverse(s)
返回字符串 s 的翻轉(zhuǎn)串。
print(string.reverse("abc"))
Output:
cba
string.sub(s)
返回 s 的子串, 該子串從 i 開始到 j 為止; i 和 j 都可以為負(fù)數(shù)。 如果不給出 j ,就當(dāng)它是 -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
rld
string.upper(s)
接收一個字符串,將其中的小寫字符都轉(zhuǎn)為大寫后返回其副本。 其它的字符串不會更改。 對小寫字符的定義取決于當(dāng)前的區(qū)域設(shè)置。
print(string.upper("Hello World"))
Output:
HELLO WORLD
匹配模式
字符類:
字符類 用于表示一個字符集合。 下列組合可用于字符類:
**x: *(這里 x 不能是 魔法字符 ^$()%.[]+-? 中的一員) 表示字符 x 自身。
**.: **(一個點)可表示任何字符。
**%a: **表示任何字母。
**%c: **表示任何控制字符。
**%d: **表示任何數(shù)字。
**%g: **表示任何除空白符外的可打印字符。
**%l: **表示所有小寫字母。
**%p: **表示所有標(biāo)點符號。
**%s: **表示所有空白字符。
**%u: **表示所有大寫字母。
**%w: **表示所有字母及數(shù)字。
**%x: **表示所有 16 進(jìn)制數(shù)字符號。
**%x: **(這里的 x 是任意非字母或數(shù)字的字符) 表示字符 x。 這是對魔法字符轉(zhuǎn)義的標(biāo)準(zhǔn)方法。 所有非字母或數(shù)字的字符 (包括所有標(biāo)點,也包括非魔法字符) 都可以用前置一個 '%' 放在模式串中表示自身。
-
**[set]: **表示 set 中所有字符的聯(lián)合。 可以以 '-' 連接,升序書寫范圍兩端的字符來表示一個范圍的字符集。 上面提到的 %x 形式也可以在 set 中使用 表示其中的一個元素。 其它出現(xiàn)在 set 中的字符則代表它們自己。 例如,[%w_] (或 [_%w]) 表示所有的字母數(shù)字加下劃線), [0-7] 表示 8 進(jìn)制數(shù)字, [0-7%l%-] 表示 8 進(jìn)制數(shù)字加小寫字母與 '-' 字符。
交叉使用類和范圍的行為未定義。 因此,像 [%a-z] 或 [a-%%] 這樣的模式串沒有意義。
**[^set]: **表示 set 的補集, 其中 set 如上面的解釋。
所有單個字母表示的類別(%a,%c,等), 若將其字母改為大寫,均表示對應(yīng)的補集。 例如,%S 表示所有非空格的字符。
如何定義字母、空格、或是其他字符組取決于當(dāng)前的區(qū)域設(shè)置。 特別注意:[a-z] 未必等價于 %l 。
模式條目:
模式條目 可以是
- 單個字符類匹配該類別中任意單個字符;
- 單個字符類跟一個 '', 將匹配零或多個該類的字符。 這個條目總是匹配盡可能長的串*;
- 單個字符類跟一個 '+', 將匹配一或更多個該類的字符。 這個條目總是匹配盡可能長的串;
- 單個字符類跟一個 '-', 將匹配零或更多個該類的字符。 和 '' 不同, 這個條目總是匹配盡可能短的串*;
- 單個字符類跟一個 '?', 將匹配零或一個該類的字符。 只要有可能,它會匹配一個;
- %n, 這里的 n 可以從 1 到 9; 這個條目匹配一個等于 n 號捕獲物(后面有描述)的子串。
- %b_xy_, 這里的 x 和 y 是兩個明確的字符; 這個條目匹配以 x 開始 y 結(jié)束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果從左到右讀這個字符串,對每次讀到一個 x 就 +1 ,讀到一個 y 就 -1, 最終結(jié)束處的那個y 是第一個記數(shù)到 0 的 y。 舉個例子,條目 %b() 可以匹配到括號平衡的表達(dá)式。
- %f[set], 指 邊境模式; 這個條目會匹配到一個位于 set 內(nèi)某個字符之前的一個空串, 且這個位置的前一個字符不屬于 set 。 集合 set 的含義如前面所述。 匹配出的那個空串之開始和結(jié)束點的計算就看成該處有個字符 '\0' 一樣。
模式:
模式 指一個模式條目的序列。 在模式最前面加上符號 '^' 將錨定從字符串的開始處做匹配。 在模式最后面加上符號 '$' 將使匹配過程錨定到字符串的結(jié)尾。 如果 '^' 和 '$' 出現(xiàn)在其它位置,它們均沒有特殊含義,只表示自身。
捕獲:
模式可以在內(nèi)部用小括號括起一個子模式; 這些子模式被稱為 捕獲物。 當(dāng)匹配成功時,由 捕獲物 匹配到的字符串中的子串被保存起來用于未來的用途。 捕獲物以它們左括號的次序來編號。 例如,對于模式 "(a(.)%w(%s))" , 字符串中匹配到 "a(.)%w(%s)" 的部分保存在第一個捕獲物中 (因此是編號 1 ); 由 "." 匹配到的字符是 2 號捕獲物, 匹配到 "%s*" 的那部分是 3 號。
作為一個特例,空的捕獲 () 將捕獲到當(dāng)前字符串的位置(它是一個數(shù)字)。 例如,如果將模式 "()aa()" 作用到字符串 "flaaap" 上,將產(chǎn)生兩個捕獲物: 3 和 5 。