字符類基礎函數舉例介紹:
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' ) 返回相同位置
string.find( s, 'substr', index ) 該函數的第三個參數是開始查找下標
由此,find函數簡單查找子串(包含字符) 返回值是2個值;沒有找到,即返回nil。
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
函數: gsub
每次找到匹配字符串時,調用該函數並將匹配字符串作為參數傳入。
string.gsub( s , “$(%w+)” , function(n)
return tostring( _G[n] )
end )
舉例
將login_string長字符串中內容讀取到一個table中,去除前面無意義前綴
login_string = "lgn|Puserid=4542379,svrid=qxzh0001,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"
--長字符串中前5個字符去掉
kvtable = { }
login_string_std = string.sub(login_string , 6) -- lua中索引從1開始
--因為長字符串中有字段的內容為空'origin',模式中第二個選用*
for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do
kvtable[k] = v
end
補充:pairs 與 ipairs
在遍歷table
的時候的區別:
首先,說明一下,數組table(array)
就是 key 為連續數字的table.
那么,簡而言之,ipairs
是遍歷數組的;pairs
是遍歷記錄table(k,v)的
用
pairs
來遍歷table(k,v),將會逐個讀取出來,而遍歷table(array)也會全部讀取出來。
用ipairs
來遍歷table(k,v),將會停止在第一個非數字key的地方或者停止在得到的value是nil的地方,而遍歷table(array)就順利全部遍歷出來了,返回0。
最后,使用ipairs
比較嚴格,使用pairs
比較寬松。