Lua學習之字符串函數及模式匹配

一,字符類基礎函數舉例介紹:

string.len( ‘string’ )  

string.lower( ‘string’ )

string.upper( ‘string’ )

string.rep( ‘a’ , 5 )  ==> aaaaa

string.sub( ‘string’ , I , j )

string.sub( s, string.find(s, 'world') )

string.sub函數會提取子串by子串所在字符串的位置下標

string.char()   string.byte()

string.format( ‘%02d:%02d:%02d’ , d , m , y )


 

二,模式匹配(pattern-matching)函數舉例介紹:字符串=>被查找的字符串;子串=>要查找的字符():

string.find( 'string', 'substr' )  返回 子串的前後位置

string.find( 'string', 'c' )  返回相同位置

由此,find函數簡單查找子串(包含字符返回值是2個值;沒有找到,即返回nil

 

string.find( s, 'substr', index ) 該函數的第三個參數是開始查找下標

 

string.match()函數返回匹配到的子串的一份copy

string.match( 'string' , '%d+/%d+%d+') -->12/23/34

 

string.gsub( 'Lua is cute', 'cute', 'great' )  -->Lua is great

用第三個參數替換第一個參數中所有出現的第二個參數,並返回整串以及發生的實際替換次數。


string.gsub( 'all lla' , 'l' , 'x' , 3 ) -->axx xla 第四個參數限制替換的次數

 

string.gmatch(s, '%a') 將返回一個函數,遍歷到所有的模式指定子串by返回的函數。

words = {}

for w in string.gmatch( s, "%a+" ) do

words[#words+1] = w

end

 

總結一下:各模式匹配函數的基本簡單功能

find( 'string' , 'strsub' , index )   從起始位置(index)查找子串返回位置

match( 'string' , '%s%d.....' )  匹配捕獲,返回子串的copy

gmatch( 'string', '%s%d' )  全局匹配捕獲,返回一個函數提供所有子串

gsub( 'string' , 'go' , 'come' , count)  替換字符串中所有go子串換count

其實,差不多是根據函數返回值不同,則大約功能相差一些,參數排布相似,並且都是遍歷查找功能。那麼上面大致的三類就引領了模式匹配3個大的功能方面:查找,捕獲,替換。

 

 

三,模式們(基礎元素) 模式就是一種字符串,模式函數會解釋它們,它們就有了意義

字符分類:(字符,即一個)分類字符們的大寫表示相對補集

%d(數字)%a(字母)%c(控制字符)%l(小寫字母)

%p(標點)%s(空白字符)%u(大寫字母)

%w( a | d )%x(十六進制數字)

特殊字符們: (  )  .  %  +  -  *  ?  [  ]  ^  $

普通字符串,用來轉義: ‘\n’

模式函數解釋模式串模式中的 特殊字符們需要使用原字符意義用%轉義。

但是,嘗試了一下這種情況:  string.find( s , ‘^[+-]?%d+$’ ) 依然能夠匹配出字符串前面的+-號,當然string.find( s , ‘[%+%-]?%d+’ )也能夠匹配出結果。所以,建議使用後者,含義比較清晰。

 

字符集: [%w_]  [AEIOUaeiou]  [0-9A-Fa-f]  [^\n]  [^%s] %S

描述模式的重複和可選:  

+  重複1次以上 

*-  重複隨便幾次

?  0次,1

 

 

四,捕獲 (  )

函數string.match會將所有捕獲到的值返回

date = Today is 12/12/2012

d , m , y = string.match( date, (%d+)/(%d+)/(%d+))

%d 用來匹配與前面第d個捕獲相同內容,不僅是字符個數相同。

q,quotedPart = string.match( s , ([\”’])(.-)%1)  à%1的地方必須要與前面([\”’])相同的內容來填補%1此位置。

 

s = string.gsub(s , \\(%a+){(.-)} , <%1><%2><\%1> )

%d此展位捕獲前面位置內容的項,也可以用在替換函數中。

 

function  trim ( s )

return ( string.gsub( s , ^%s*(.-)%s*$ , %1 ) )

end

 

五,替換

string.gsub 函數的第三個參數不僅是替換的字符串,還可以是一個table , 或者是一個函數。

table: gsub每次找到匹配字符串時,以此字符串作爲key,table中對應的value來替換,沒有對應value,不替換。

string.gsub( s , $(%w+) , _G )  à _G是全局變量的table

 

function: gsub每次找到匹配字符串時,調用該函數並將匹配字符串作爲參數傳入。

string.gsub( s , $(%w+) , function(n)

return tostring( _G[n] )

end )


 

一個小的代碼演示:

    

local login_string = "abcdeAAAAAA=4543578,SSSSS=qx564201,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"


local kvtable = { }   --定義一個用來保存上面字符串的K,V的table.

local login_string_std = string.sub(login_string , 6)   --取得AAA.....開始的後面全部字符串


for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do  --注意到了嗎origin木有值

kvtable[k] = v    --逐個記錄

end

 

六,URL編碼 tab擴展 以及一些技巧 

隨後,若有時間,再總結。。。

 

************pairs 與 ipairs***************

在遍歷table的時候的區別:

首先,說明一下,數組table(array)就是key 爲連續數字的table.

那麼,簡而言之,ipairs 是遍歷數組的;pairs是遍歷table(k,v)

所以用pairs來遍歷table(k,v),將會逐個遍歷出來,而遍歷table(array)也會全部遍歷出來,最後返回nil。。。用ipairs來遍歷table(k,v),將會停止在第一個非數字key的地方或者停止在得到的valuenil的地方,而遍歷table(array)就順利全部遍歷出來了,返回0

最後,使用ipairs比較嚴格,使用pairs比較寬鬆。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章