Lua 之string库
標(biāo)準(zhǔn)string庫(kù)
基礎(chǔ)字符串函數(shù)
?
string.len(s)
返回一個(gè)字符串的長(zhǎng)度,例如
print(string.len("hello world")) -- 11?
string.rep(s, n)
返回一個(gè)新的字符串,該字符串是參數(shù)s重復(fù)n次得到的結(jié)果,例如
print(string.rep("go", 3)) -- gogogo?
string.lower(s)
string.upper(s)
字符串大小寫(xiě)轉(zhuǎn)換,例如
print(string.lower("gOogLe")) -- google print(string.upper("gOogLe")) -- GOOGLE?
string.sub(s, i, j)
返回字符串的一個(gè)子串,子串的起始/結(jié)束位置由參數(shù)i, j決定。例如:
print(string.sub("google", 2, 3)) -- 'oo' print(string.sub("google", 4)) -- 'gle' print(string.sub("google", 1, -2)) -- 'googl' print(string.sub("google", 100)) -- ''?
string.char(num1, num2, ...)
string.byte(s, i, j)
在字符與其ASCII碼之間轉(zhuǎn)換。
string.char 函數(shù)接收零個(gè)或多個(gè)整數(shù),并將每個(gè)整數(shù)轉(zhuǎn)換成對(duì)應(yīng)的字符,然后返回一個(gè)由這些字符構(gòu)成的字符串。
string.byte 返回字符串s中第i到第j個(gè)字符的ASCII值,i值默認(rèn)等于1,j值默認(rèn)等于i。
print(string.byte('google')) -- 103 print(string.byte('google', 2)) -- 111 print(string.byte('google', 1, -1)) -- 103 111 111 103 108 101print(string.char(111)) -- 'o' print(string.char(103, 111, 101)) -- 'goe'注意,string.char()返回一個(gè)字符串,而string.byte可能存在多個(gè)返回值,其中每個(gè)值都是一個(gè)number類型的數(shù)字。
?
string.format("format", s, ...)
格式化字符串,它跟C語(yǔ)言里面的printf函數(shù)非常類似,例如:
print(string.format("pi=%.4f", math.pi))print(string.format("today is %02d/%02d/%04d", 27, 10, 2014))?
?
模式匹配函數(shù)
模式匹配函數(shù)有4個(gè):find、match、gsub(全局替換)、gmatch(全局匹配),它們都是基友模式匹配(pattern match)實(shí)現(xiàn)的。
?
string.find(s, pattern, b)
string.find 函數(shù)在一個(gè)給定的目標(biāo)字符串中搜索符合指定pattern的第一個(gè)子串,如果找到返回子串的起始和結(jié)束位置,沒(méi)有找到任何匹配,返回nil。
?
s = "hello sky, the sky is mine"i, j = string.find(s, "sky")print('i=' .. i .. ', j=' .. j) -- i=7, j=9 print(string.sub(s, i, j)) -- 'sky' print(string.find(s, 'world')) -- nil?
string.find函數(shù)的第3個(gè)參數(shù)可選(默認(rèn)值為1),用于告訴函數(shù)應(yīng)從目標(biāo)字符串的哪個(gè)位置開(kāi)始搜索,如果我們需要找到目標(biāo)字符串中所有符合pattern的子串,這個(gè)參數(shù)就很有用,例如:
local t = {} local i = 0 local s = 'line 1\nline 2\nline 3\nline 4\nline 5\n'while true doi = string.find(s, "\n", i+1)if i==nil then break endt[#t+1] = i end當(dāng)然,上面例子中的功能,有一個(gè)更加簡(jiǎn)單的實(shí)現(xiàn)辦法,就是使用string.gmatch函數(shù)。
?
?
string.match(s, pattern)
函數(shù)string.match與string.find非常類似,不過(guò)它返回的是目標(biāo)字符串中與pattern匹配的子串,而非子串所在的位置。
date = "today is 27/10/2014" print(string.match(date, "%d+/%d+/%d+")) -- 27/10/2014?
?
string.gmatch(s, pattern)
string.gmatch 是全局匹配函數(shù),它返回一個(gè)迭代器,通過(guò)返回的迭代器可以遍歷目標(biāo)字符串中所有出現(xiàn)指定模式的地方。
一個(gè)例子,找出給定字符串中的所有單詞:
s = "hello sky, the sky is mine"words = {}for w in string.gmatch(s, "%a+") dowords[#words+1] = w endfor _,v in ipairs(words) doprint(v) end?
?
string.gsub(s, pattern, rep, max)
string.gsub 是全局替換函數(shù),將目標(biāo)字符串中所有模式出現(xiàn)的地方替換為替換字符串。
第4個(gè)參數(shù)可選,用于限定替換的最大次數(shù)。
string.gsub函數(shù)有2個(gè)返回值,第一個(gè)返回值表示替換后的新字符串,第二個(gè)返回值表示替換次數(shù)。如果沒(méi)有找到需要替換的模式,則分別返回原字符串和0;
old = "hello sky, the sky is mine" new, count = string.gsub(old, "sky", "world")print(new) -- hello world, the world is mine print(count) -- 2?
string.gsub 第3個(gè)參數(shù)除了是字符串以外,還可以是函數(shù)或table。
當(dāng)用一個(gè)函數(shù)來(lái)調(diào)用時(shí),string.gsub會(huì)在每次找到匹配時(shí)調(diào)用該函數(shù),調(diào)用時(shí)的參數(shù)就是捕獲到的內(nèi)容,而該函數(shù)的返回值則作為要替換的字符串。
當(dāng)用一個(gè)table來(lái)調(diào)用時(shí),string.gsub會(huì)用每次捕獲到的內(nèi)容作為key,并將對(duì)于的value作為要替換的字符串,如果table中不包含這個(gè)key,那么string.gsub不改變這個(gè)匹配。
上面的例子中,對(duì)每處與"$(%w+)"相匹配的地方,string.gsub都會(huì)在_G中查找捕獲到的名稱,并用找到的value替換字符串中的匹配部分。
?
如果不確定所有的變量都有一個(gè)對(duì)應(yīng)的字符串值,則可以對(duì)它們的值應(yīng)用tostring,這種情況下,可以用一個(gè)函數(shù)來(lái)提供要替換的值:
function expand(s)return (string.gsub(s, "$(%w+)", function(n) return tostring(_G[n]) end )) end print(expand("print=$print; a=$a")) -- print=function: 0x1f3fa40; a=nil?
?
模式(pattern)
限于Lua解釋器的大小,Lua并不支持完整的PCRE,但Lua的模式匹配也非常強(qiáng)大,支持元字符、字符集等。
注意:對(duì)于Lua來(lái)說(shuō),模式就是普通的字符串,只有上面提到的幾個(gè)模式函數(shù)才能解釋它們。
?
| 字符類 | 對(duì)應(yīng)的字符集 |
| . | 任意字符 |
| %a | 字母 |
| %c | 控制字符 |
| %d | 數(shù)字 |
| %l | 小寫(xiě)字母 |
| %p | 標(biāo)點(diǎn)符號(hào) |
| %s | 空白符 |
| %u | 大寫(xiě)字母 |
| %w | 字母和數(shù)字 |
| %x | 16進(jìn)制數(shù)字 |
| %z | 代表0的字符 |
?
上面字符類的大寫(xiě)形式表示小寫(xiě)所代表的集合的補(bǔ)集。
?
例如將目標(biāo)字符串中出現(xiàn)的非字母字符替換為"."?
?
計(jì)算一段文本中元音字母出現(xiàn)的次數(shù):
count = select(2, string.gsub(text, "[AEIOUaeiou]", ""))?
?
| % | 用作特殊字符(非字母字符)的轉(zhuǎn)義字符,比如‘%%’匹配字符’%’ |
| [ ] | 匹配指定的字符集,比如[%w_]匹配數(shù)字、字母和下劃線 |
| ? | |
| + | 匹配前一字符1次或多次,比如”%a+”匹配一個(gè)單詞 |
| * | 匹配前一字符0次或多次,貪婪匹配,比如”%s*”匹配空白 |
| - | 匹配前一字符0次或多次,懶惰匹配 |
| ? | 匹配前一字符0次或1次 |
| ? | |
| ^ | 匹配開(kāi)頭,如果在字符集[]里面就表示補(bǔ)集 |
| $ | 匹配結(jié)尾 |
| %b | 匹配成對(duì)的字符 |
?
"+"修飾符可匹配屬于字符分類的一個(gè)或多個(gè)字符,它總是獲取與模式相匹配的最長(zhǎng)序列。
修飾符"-"和"*"的區(qū)別是,前者匹配最短的子串,后者匹配最長(zhǎng)的子串。
s = "if condition then statements end" print(string.match(s, '[_%a][_%w]*')) -- if print(string.match(s, '[_%a][_%w]-')) -- i test = "int x; /* x */ int y; /* y */" print(string.gsub(test, "/%*.*%*/", "<COMMENT>")) -- int x; <COMMENT> 1print(string.gsub(test, "/%*.-%*/", "<COMMENT>")) -- int x; <COMMENT> int y; <COMMENT> 2注意:在模式的開(kāi)始或結(jié)尾處使用修飾符“-” 沒(méi)有意義,因?yàn)樗倳?huì)匹配空字符。
?
%b用于匹配成對(duì)的字符,如下:
s = "a (enclosed (in) parentheses) line" print(string.gsub(s, "%b()", "")) -- a line 1 test = "<title> hello world </title>" print(string.gsub(test, "%b<>", "")) -- hello world 2?
?
捕獲(capture)
捕獲功能可根據(jù)一個(gè)模式從目標(biāo)字符串中抽出匹配與該模式的內(nèi)容。在指定捕獲時(shí),在模式中將需要捕獲的部分寫(xiě)到一對(duì)圓括號(hào)內(nèi)。
對(duì)于具有捕獲的模式,函數(shù)string.match會(huì)將所有捕獲到的值作為單獨(dú)的結(jié)果返回。即將目標(biāo)字符串切成多個(gè)捕獲到的部分。
pair = "name = Anna" key, value = string.match(pair, "(%a+)%s*=%s*(%a+)") print(key, value) -- name Anna?
在一個(gè)模式中,可以使用 "%1"、"%2" 這樣的項(xiàng),表示匹配與第d個(gè)捕獲相同的內(nèi)容。
如下面的例子,模式中的"%1"表示匹配第一個(gè)捕獲(即引號(hào))的內(nèi)容,從而用來(lái)指定第二個(gè)引號(hào)。
s = [[then he said: "it's all right"!]] q, quotedPart = string.match(s, "([\"'])(.-)%1") print(quotedPart) -- it's all right?
對(duì)于捕獲到的值,還可用于string.gsub函數(shù)的字符串替換。和模式一樣,用于替換的字符串中也可以包含"%d"這樣的項(xiàng)。當(dāng)進(jìn)行替換時(shí),這些項(xiàng)就對(duì)應(yīng)于捕獲到的內(nèi)容。"%0"表示整個(gè)匹配,并且替換字符串中的"%"必須轉(zhuǎn)義為"%%"。
print(string.gsub("hello Lua!", "%a", "%0-%0")) -- h-he-el-ll-lo-o L-Lu-ua-a! 8print(string.gsub(" hello world ", "^%s*(.-)%s*$", "%1")) -- hello world?
總結(jié)
以上是生活随笔為你收集整理的Lua 之string库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转载:thread的六种状态
- 下一篇: 炙手可热的前端资源大集合