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

2021-09-24 10:21:41 字數 4478 閱讀 9580

對於簡單的函式,我只是將其以舉例的方式羅列一下,對於一些功能較多的函式,會舉例分析一下,並簡單總結,全文以舉例為驅動。

一,字元類基礎函式舉例介紹:

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木有值

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的地方或者停止在得到的

value

是nil

的地方,而遍歷

table(array)

就順利全部遍歷出來了,返回0。

最後,使用ipairs

比較嚴格,使用

pairs

比較寬鬆。

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函式會提取子...

Lua的字串分割函式

lua中的字串函式 函式功能 string.len s 返回字串s的長度 string.rep s,n 返回重複n次字串s的串 你使用string.rep a 2 20 可以建立乙個1m bytes的字串 string.lower s 將s中的大寫字母轉換成小寫 string.upper s 將s中...

awk模式之正則及常用的字串函式

awk的內建字串函式 1.格式化輸出print和printf 和c語言風格一致,表示左對齊,預設是右對齊 s字元型,d十進位制數值型,f浮點型 root mysql master awk f tmp file1 username root uid 0 username bin uid 1 usern...