Lua學習筆記之字串及模式匹配

2021-09-26 04:38:53 字數 4045 閱讀 1051

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 )

字串=>被查詢的字串

子串=>要查詢的字元(串)

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

在遍歷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比較寬鬆。

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

對於簡單的函式,我只是將其以舉例的方式羅列一下,對於一些功能較多的函式,會舉例分析一下,並簡單總結,全文以舉例為驅動。一,字元類基礎函式舉例介紹 string.len string string.lower string string.upper string string.rep a 5 aaaa...

Lua 筆記 Lua 字串

目錄 lua 字串 字串操作 字串擷取 字串大小寫轉換 字串查詢與反轉 字串格式化 字元與整數相互轉換 案例 string1 lua print 字串 1 是 string1 string2 runoob.com print 字串 2 是 string2 string3 lua 教程 print 字...

lua學習筆記 字串操作

1.定義 雙引號 單引號 和字串組 2.轉義字元 注意這裡是 不是 n換行 輸出 輸出 就寫幾個常用的,別的暫時就不詳細寫了 3.字串操作 reverse 這個方法的。不過有list.reverse 網上反轉的方法也有很多,這裡寫乙個不用reverse的。同時分享乙個字串反轉的坑。就是對字串操作時,...