lua原生解釋器對字符串的處理能力是十分有限的,強(qiáng)大的字符串操作能力來自于string庫。lua的string函數(shù)導(dǎo)出在string module中。在lua5.1,同時(shí)也作為string類型的成員方法,因此,我們既可以寫成string.upper(s), 也可以s:upper(),選擇你喜歡的寫法。
string.len(s)返回s的長度。
string.rep(s, n)返回重復(fù)s字符串n次的字符串。
string.lower(s)返回一份已將大寫轉(zhuǎn)成小寫的字符串s的拷貝
lower,upper都是使用本地字符集的,另外,如果你想對一個(gè)string數(shù)組進(jìn)行排序,并不區(qū)分大小寫,你可能像這么寫:
復(fù)制代碼 代碼如下:
table.sort(a, function(a, b)
return string.lower(a) string.lower(b)
end)
string.sub(s, i, j)將從s提取一段字符串,從i到j(luò)(閉區(qū)間[i, j]),當(dāng)然你可以使用負(fù)索引值,將從字符串尾部算起,-1是最后一個(gè)字符,-2是倒數(shù)第二,等等,這么做的好處是當(dāng)我們要提取直到末尾幾個(gè)字符時(shí),從后面數(shù)起就很方便。例如:
復(fù)制代碼 代碼如下:
s = "[hello,world]"
print(string.sub(s, 2, -2)) --> hello,world
記住,lua中的字符串是不可變的。
string.char, string.byte用于轉(zhuǎn)換字符和對于的數(shù)字之間值。例如:
復(fù)制代碼 代碼如下:
i = 97
print(string.char(i, i+1, i+2)) --> abc
print(string.byte("abc")) --> 97
print(string.byte("abc"), -2) --> 98
lua5.1 string.byte可以接受第三個(gè)參數(shù),返回i,j之間的多個(gè)值。例如,這么寫將字符串轉(zhuǎn)成字符值數(shù)組:
復(fù)制代碼 代碼如下:
t = {s.byte(1, -1}
要想重新轉(zhuǎn)成字符串的話:
復(fù)制代碼 代碼如下:
string.char(unpack(t))
string.format是強(qiáng)大字符串格式化函數(shù),和c語言的printf類似,這里不累述。
lua string庫里最強(qiáng)大的函數(shù)是那些模式匹配函數(shù):find, match, gsub, gmatch。和其他腳本語言不同,lua既沒有用POSIX的正則表達(dá)式,也沒有用perl的正則表達(dá)式。原因是實(shí)現(xiàn)這些導(dǎo)致lua占用更多內(nèi)存,而lua的初衷是小巧的,嵌入應(yīng)用的語言。 lua用少于500行的代碼實(shí)現(xiàn)了自己的一套模式匹配,雖然不如標(biāo)準(zhǔn)的正則表達(dá)式強(qiáng)(一般需要4000以上代碼),但也足夠強(qiáng)大。
string.find將查找目標(biāo)模板在給定字符串中出現(xiàn)的位置,找到返回起始和結(jié)束位置,沒找到返回nil。例如:
復(fù)制代碼 代碼如下:
s = "hello,world"
i, j = string.find(s, "hello")
print(string.sub(s, i, j))
當(dāng)然,string.find還可以給定起始搜索位置,當(dāng)你想找出所有出現(xiàn)的位置時(shí),這個(gè)參數(shù)就很有用,例如想知道換行符出現(xiàn)在那些地方:
復(fù)制代碼 代碼如下:
local t = {}
local i = 0
while true do
i = string.find(s, "\n", i+1)
if i == nil then break end
t[#t+1] = i
end
string.match和string.find類似,都是在指定的string中查找相應(yīng)的模式。不同的是,他返回的是找到的那部分string:
復(fù)制代碼 代碼如下:
print(string.match("hello,world","hello")) --> hello
對于像"hello"這樣的固定模式來說,這個(gè)函數(shù)就沒啥意義了。但是對于可變模式來說,就顯示出他的強(qiáng)大威力了:
復(fù)制代碼 代碼如下:
date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d) --> 2014/10/6
string.gsub有三個(gè)參數(shù),給定字符串,匹配模式和替代字符串。作用就是將所有符合匹配模式的地方都替換成替代字符串。并返回替換后的字符串,以及替換次數(shù)。
復(fù)制代碼 代碼如下:
s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great
string.gmatch函數(shù)將返回一個(gè)迭代器,用于迭代所有出現(xiàn)在給定字符串中的匹配字符串。
模式:
字符類:(character classes)
復(fù)制代碼 代碼如下:
. all characters
%a letters
%c control characters
%d digits
%l lower -case letters
%p punctuation characters
%s space characters
%u upper-case letters
%w alphanumeric characters
%x hexadecimal digits
%z the character whose representation is 0
他們的大寫版本是他本身的互補(bǔ)。
魔法字符:
復(fù)制代碼 代碼如下:
( ) . % + - * ? [ ] ^ $
用%進(jìn)行轉(zhuǎn)義。'%%'代表'%'
字符集(char -set ):使用字符集可以自定義字符類。
1.不同的字符類,和單字符之間用[]
[%w_]匹配字母數(shù)字字符和下劃線。
[01]匹配二進(jìn)制數(shù)
2.要想字符集內(nèi)包含字符區(qū)間,起止之間加上-
[0-9] 相當(dāng)于 %d
[0-9a-fA-F]相當(dāng)于 %x
3.如果想得到該字符集的互補(bǔ),前面加上^
[^0-7] 任何非八進(jìn)制數(shù)字
重復(fù)或可選修飾符
復(fù)制代碼 代碼如下:
+ 1 or more repetitions,匹配最長的,
* 0 or more repetitions 最長的
- also 0 or more repetitions 最短的
? optional (0 or 1 occurrence)
捕獲
捕獲機(jī)制允許一個(gè)模式串中的一部分來匹配目標(biāo)串種的一部分。寫法是模式串中你需要捕獲的那部分用()括起來,例如:
復(fù)制代碼 代碼如下:
pair = "name = anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name anna
我們也可以將捕獲用于模式串自身,"([\"'])(.-)%1",這里的%1表示匹配第一個(gè)捕獲的一份拷貝。
替換
前面已知道,string.gsub的參數(shù)可以是string,其實(shí),也可以是個(gè)函數(shù),或是table,如果是函數(shù),就會(huì)用捕獲的內(nèi)容作為參數(shù)調(diào)用該函數(shù),將返回的內(nèi)容作為替換字符串。如果是table,則用捕獲的內(nèi)容為key去取table的值來作為替換字符串,如果不存在,就不做替換。如:
復(fù)制代碼 代碼如下:
function expand(s)
return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))
(完)
您可能感興趣的文章:- Lua中string.len()使用指南
- Lua loadstring函數(shù)用法實(shí)例
- Lua中的loadfile、dofile、loadstring、require用法實(shí)例
- Lua字符串庫(string庫)學(xué)習(xí)筆記
- LUA string庫使用小結(jié)
- Lua中的string庫(字符串函數(shù)庫)總結(jié)
- Lua中實(shí)現(xiàn)StringBuffer功能
- Lua中字符串(string)淺析
- Lua中string.lower()使用指南