1. 程式人生 > 其它 >string返回第n個字元_Programming in Lualua學習第13期 Lua字串庫

string返回第n個字元_Programming in Lualua學習第13期 Lua字串庫

技術標籤:string返回第n個字元

微信公眾號:GameToolDev
關注可瞭解更多的遊戲工具開發教程。問題或建議,請公眾號留言;

1. 基礎字串函式: 字串庫中有一些函式非常簡單,如: 1).string.len(s) 返回字串s的長度; 2). string.rep(s,n) 返回字串s重複n次的結果; 3). string.lower(s) 返回s的副本,其中所有的大寫都被轉換為了小寫形式,其他字元不變; 4). string.upper(s) 和lower相反,將小寫轉換為大寫; 5). string.sub(s,i,j) 提取字串s的第i個到第j個字元。Lua中,第一個字元的索引值為1,最後一個為-1,以此類推,如: print(string.sub("[hello world]",2,-2)) --輸出hello world 6). string.format(s,...) 返回格式化後的字串,其格式化規則等同於C語言中printf函式,如: print(string.format("pi = %.4f",math.pi))--輸出pi = 3.1416 7). string.char(...) 引數為0到多個整數,並將每個整數轉換為對應的字元。然後返回一個由這些字元連線而成的字串,如: print(string.char(97,98,99))--輸出abc 8). string.byte(s,i) 返回字串s的第i個字元的Ascii值,如果沒有第二個引數,預設返回第一個字元的Ascii值。 print(string.byte("abc"))--輸出97 print(string.byte("abc",-1))--輸出99 由於字串型別的變數都是不可變型別的變數,因此在所有和string相關的函式中,都無法改變引數中的字串值,而是生成一個新值返回。 2. 模式匹配函式: Lua的字串庫提供了一組強大的模式匹配函式,如find、match、gsub和gmatch。 1). string.find函式: 在目標字串中搜索一個模式,如果找到,則返回匹配的起始索引和結束索引,否則返回nil。如:

1s="helloworld"
2i,j=string.find(s,"hello")
3print(i,j)--輸出15
4i,j=string.find(s,"l")
5print(i,j)--輸出33
6print(string.find(s,"lll"))--輸出nil

string.find函式還有一個可選引數,它是一個索引,用於告訴函式從目標字串的哪個位置開始搜尋。主要用於搜尋目標字串中所有匹配的子字串,且每次搜尋都從上一次找到的位置開始。如:

1localt={}
2locali=0
3whiletruedo
4i=string.find(s,"\n",i+1)
5ifi==nilthen
6break
7end
8t[#t+1]=i
9end

2). string.match函式: 該函式返回目標字串中和模式字串匹配的部分。如:

1date="Todayis2012-01-01"
2d=string.match(date,"%d+\-%d+\-%d+")
3print(d)--輸出2012-01-01

3). string.gsub函式: 該函式有3個引數,目標字串、模式和替換字串。基本用法是將目標字串中所有出現模式的地方替換為替換字串。如: print(string.gsub("Lua is cute","cute","great"))--輸出Lua is great 該函式還有可選的第4個引數,即實際替換的次數。 print(string.gsub("all lii","l","x",1))--輸出axl lii print(string.gsub("all lii","l","x",2))--輸出axx lii 函式string.gsub還有另一個結果,即實際替換的次數。 count = select(2, string.gsub(str," "," "))--輸出str中空格的數量 4). string.gmatch函式: 返回一個函式,通過這個返回的函式可以遍歷到一個字串中所有出現指定模式的地方。如:

1words={}
2s="helloworld"
3forwinstring.gmatch(s,"%a+")do
4print(w)
5words[#words+1]=w
6end
7--輸出結果為:
8--hello
9--world

3. 模式:
下面的列表給出了Lua目前支援的模式元字元;

模式元字元描述
.所有字元
%a字母
%c控制字元
%d數字
%l小寫字母
%p標點符號
%s空白字元
%u大寫字母
%w字母和數字字元
%x十六進位制數字
%z內部表示為0的字元

這些元字元的大寫形式表示它們的補集,如%A,表示所有非字母字元。 print(string.gsub("hello, up-down!","%S","."))--輸出hello..up.down. 4
上例中的4表示替換的次數。
除了上述元字元之外,Lua還提供了另外幾個關鍵字元。如:( ) . % + - * ? [ ] ^ $
其中%表示轉義字元,如%.表示點(.),%%表示百分號(%)。
方括號[]表示將不同的字元分類,即可創建出屬於自己的字元分類,如[%w_]表示匹配字元、數字和下劃線。
橫線(-)表示連線一個範圍,比如[0-9A-Z]
如果^字元在方括號內,如[^\n],表示除\n之外的所有字元,即表示方括號中的分類的補集。如果^不在方括號內,則表示以後面的字元開頭,$和它正好相反,表示以前面的字元結束。如:^Hello%d$,匹配的字串可能為Hello1、Hello2等。
在Lua中還提供了4種用來修飾模式中的重複部分,如:+(重複1次或多次)、*(重複0次或多次)、-(重複0次或多次)和?(出現0或1次)。如: print(string.gsub("one, and two; and three","%a+","word"))--輸出word, word word; word word print(string.match("the number 1298 is even","%d+"))--輸出1298
星號(*)和橫線(-)的主要差別是,星號總是試圖匹配更多的字元,而橫線則總是試圖匹配最少的字元。 4. 捕獲(capture):
捕獲功能可根據一個模式從目標字串中抽出匹配於該模式的內容。在指定捕獲是,應將模式中需要捕獲的部分寫到一對圓括號內。對於具有捕獲的模式,函式string.match會將所有捕獲到的值作為單獨的結果返回。即它會將目標字串切成多個捕獲到的部分。如:

1pair="name=Anna"
2key,value=string.match(pair,"(%a+)%s*=%s*(%a+)")
3print(key,value)--輸出nameanna
4
5date="Todayis2012-01-02"
6y,m,d=string.match(date,"(%d+)\-(%d+)\-(%d+)")
7print(y,m,d)--輸出20120102

還可以對模式本身使用捕獲。即%1表示第一個捕獲,以此類推,%0表示整個匹配,如:

1print(string.gsub("helloLua","(.)(.)","%2%1"))--將相鄰的兩個字元對調,輸出為ehllouLa
2print(string.gsub("helloLua!","%a","%0-%0"))--輸出為h-he-el-ll-lo-oL-Lu-ua-a!

5. 替換: string.gsub函式的第三個引數不僅可以是字串,也可以是函式或table,如果是函式,string.gsub會在每次找到匹配時呼叫該函式,呼叫時的引數就是捕獲到的內容,而該函式的返回值則作為要替換的字串。當用一個table來呼叫時,string.gsub會用每次捕獲到的內容作為key,在table中查詢,並將對應的value作為要替換的字串。如果table中不包含這個key,那麼string.gsub不改變這個匹配。如:

1functionexpand(s)
2return(string.gsub(s,"$(%w+)",_G))
3end
4
5name="Lua";status="great"
6print(expand("$nameis$status,isn'tit?"))--輸出Luaisgreat,isn'tit?
7print(expand("$othernameis$status,isn'tit?"))--輸出$othernameisgreat,isn'tit?
8
9functionexpand2(s)
10return(string.gsub(s,"$(%w+)",function(n)returntostring(_G[n])end))
11end
12
13print(expand2("print=$print;a=$a"))--輸出print=function:002B77C0;a=nil

版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝。

ab4bb033aba05f0d3be5aebe0e3a6519.png

GameToolDev

ID:GameToolDev

www.GameToolDev.Com

遊戲工具開發丨Unity開發技術丨AI技能編輯器丨地圖編輯器

4ae6d2ebcc44219363e7ff82a1fd0e64.png