国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

關于Lua模式匹配學習教程

移動開發 iOS
Lua并不使用POSIX規范的正則表達式[4](也寫作regexp)來進行模式匹配。主要的原因出于程序大小方面的考慮:實現一個典型的符合POSIX標準的regexp大概需要4000行代碼,這比整個Lua標準庫加在一起都大。

關于Lua模式匹配學習是本文要介紹的內容,主要是來學習Lua模式匹配的問題,具體內容的實現來卡本文詳解。模式匹配函:

在string庫中功能***大的函數是:

  1. string.find(字符串查找)  
  2. string.gsub(全局字符串替換)  
  3. string.gfind(全局字符串查找)  
  4. string.gmatch(返回查找到字符串的迭代器) 

這些函數都是基于模式匹配的。與其他腳本語言不同的是,Lua并不使用POSIX規范的正則表達式[4](也寫作regexp)來進行模式匹配。主要的原因出于程序大小方面的考慮:實現一個典型的符合POSIX標準的regexp大概需要4000行代碼,這比整個Lua標準庫加在一起都大。權衡之下,Lua中的模式匹配的實現只用了500行代碼,當然這意味著不可能實現POSIX所規范的所有更能。然而,Lua中的模式匹配功能是很強大的,并且包含了一些使用標準POSIX模式匹配不容易實現的功能。

  1. string.gmatch(str, pattern)       

這是一個返回迭代器的函數. 實際的用例如下:

  1. s = "hello world from Lua" 
  2. for w in string.gmatch(s, "%a+") do  
  3.  print(w)  
  4. end 

這里是一個捕獲并將配對字符分別存到不同變量的例子:

  1. t = {}  
  2. s = "from=world, to=Lua" 
  3. for k, v in string.gmatch(s, "(%w+)=(%w+)") do  
  4.  t[k]=v  
  5. end  
  6. for k, v in pairs(t) do  
  7.  print(k, v)  
  8. end  
  9. string.gsub(str, pattern, repl, n) 

string.gsub()函數根據給定的配對表達式對源字符串str進行配對, 同時返回源字符串的一個副本, 該副本中成功配對的所有子字符串都將被替換. 函數還將返回成功配對的次數.實際的替換行為由repl參數的類型決定:

當repl為字符串時, 所有成功配對的子字符串均會被替換成指定的repl字串.
當repl為table時, 對每個成功配對的子字符串, 函數均會試圖尋找以其為key值的table中的元素, 并返回該元素. 如果該配對包含任何捕獲信息, 則以編號為1號的捕獲作為key值進行查找.
當repl為函數時, 每個成功配對的子字符串均會作為參數被傳入到該函數中去.
在repl是table或函數時, 如果該table或函數返回了字串或數字的值, 這個值依然會被用于替換副本字串中的配對子字串. 如果該table/函數返回的值為空, 將不發生替換.

n參數可選, 當它被指定時, string.gsub()函數只對源字符串中的前n個成功配對的成員進行操作.

以下是幾個例子:

  1. > print(string.gsub("hello world", "(%w+)", "%1 %1"))  
  2. hello hello world world 2  
  3. > print(string.gsub("hello Lua", "(%w+)%s*(%w+)", "%2 %1"))  
  4. Lua hello 1  
  5. > string.gsub("hello world", "%w+", print)  
  6. hello world 2  
  7. > lookupTable = {["hello"] = "hola", ["world"] = "mundo"}  
  8. > print(string.gsub("hello world", "(%w+)", lookupTable))  
  9. hola mundo 2  
  10. string.match(str, pattern, init)  

string.match()只尋找源字串str中的***個配對. 參數init可選, 指定搜尋過程的起點, 默認為1.

在成功配對時, 函數將返回配對表達式中的所有捕獲結果; 如果沒有設置捕獲標記, 則返回整個配對字符串. 當沒有成功的配對時, 返回nil.

  1. string.match("abcdaef", "a")  
  2. -> a  
  3. string.reverse(str) 

返回一個字符串的倒序排列

  1. string.reverse("abcde")  
  2. ->edcba  
  3. string.dump(function) 

返回指定函數的二進制代碼(函數必須是一個Lua函數,并且沒有上值)

  1. string.find(str, pattern, init, plain)  

string.find的基本應用就是用來在目標串(subject string)內搜索匹配指定的模式的串。函數如果找到匹配的串返回他的位置,否則返回nil.最簡單的模式就是一個單詞,僅僅匹配單詞本身。比如,模式'hello'僅僅匹配目標串中的"hello"。當查找到模式的時候,函數返回兩個值:匹配串開始索引和結束索引。

  1. s = "hello world" 
  2. string.find(s, "hello")    --> 1    5  
  3. string.find(s, "world")    --> 7    11  
  4. string.find(s, "l")        --> 3    3  
  5. string.find(s, "lll")      --> nil 

string.find函數第三個參數是可選的:標示目標串中搜索的起始位置。當我們想查找目標串中所有匹配的子串的時候,這個選項非常有用。我們可以不斷的循環搜索,每一次從前一次匹配的結束位置開始。下面看一個例子,下面的代碼用一個字符串中所有的新行構造一個表:

  1. local t = {}      -- 存放回車符的位置  
  2. local i = 0 
  3. while true do  
  4.     i = string.find(s, "\n", i+1)  -- 查找下一行  
  5.     if i == nil then break end  
  6.     table.insert(t, i)  
  7. end  
  8. string.sub(str,sPos,ePos) 

string.gsub的功能是截取字符串,他從指定起始位置截取一個字符串。string.sub可以利用string.find返回的值截取匹配的子串。

對簡單模式而言,匹配的就是其本身

  1. s = "hello world" 
  2. local i, j = string.find(s, "hello")    --> 1    5  
  3. string.sub(s, i, j)        --> hello  
  4. string.gsub(str, sourcestr, desstr) 

string.gsub的基本作用是用來查找匹配模式的串,并將使用替換串其替換掉:

string.gsub函數有三個參數:目標串,模式串,替換串。

  1. s = string.gsub("Lua is cute", "cute", "great")  
  2. print(s)      --> Lua is great  
  3. s = string.gsub("all lii", "l", "x")  
  4. print(s)      --> axx xii  
  5. s = string.gsub("Lua is great", "perl", "tcl")  
  6. print(s)      --> Lua is great 

第四個參數是可選的,用來限制替換的范圍:

  1. s = string.gsub("all lii", "l", "x", 1)  
  2. print(s)          --> axl lii  
  3. s = string.gsub("all lii", "l", "x", 2)  
  4. print(s)          --> axx lii 

string.gsub的第二個返回值表示他進行替換操作的次數。例如,下面代碼涌來計算一個字符串中空格出現的次數:

  1. _, count = string.gsub(str, " ", " ") 

(注意,_ 只是一個啞元變量)

模式

你還可以在模式串中使用字符類。字符類指可以匹配一個特定字符集合內任何字符的模式項。比如,字符類%d匹配任意數字。所以你可以使用模式串'%d%d/%d%d/%d%d%d%d'搜索dd/mm/yyyy格式的日期:

  1. s = "Deadline is 30/05/1999, firm" 
  2. date = "%d%d/%d%d/%d%d%d%d" 
  3. print(string.sub(s, string.find(s, date)))    --> 30/05/1999 

下面的表列出了Lua支持的所有字符類:

單個字符(除^$()%.[]*+-?外): 與該字符自身配對

  1. .(點): 與任何字符配對  
  2.  
  3. %a: 與任何字母配對  
  4. %c: 與任何控制符配對(例如\n)  
  5. %d: 與任何數字配對  
  6. %l: 與任何小寫字母配對  
  7. %p: 與任何標點(punctuation)配對  
  8. %s: 與空白字符配對  
  9. %u: 與任何大寫字母配對  
  10. %w: 與任何字母/數字配對  
  11. %x: 與任何十六進制數配對  
  12. %z: 與任何代表0的字符配對  
  13. %x(此處x是非字母非數字字符): 與字符x配對. 主要用來處理表達式中有功能的字符(^$()%.[]*+-?)的配對問題, 例如%%與%配對 

[數個字符類]: 與任何[]中包含的字符類配對. 例如[%w_]與任何字母/數字, 或下劃線符號(_)配對

[^數個字符類]: 與任何不包含在[]中的字符類配對. 例如[^%s]與任何非空白字符配對

當上述的字符類用大寫書寫時, 表示與非此字符類的任何字符配對. 例如, %S表示與任何非空白字符配對.例如,'%A'非字母的字符

  1. print(string.gsub("hello, up-down!", "%A", "."))  
  2.     --> hello..up.down. 4 

(數字4不是字符串結果的一部分,他是gsub返回的第二個結果,代表發生替換的次數。下面其他的關于打印gsub結果的例子中將會忽略這個數值。)在模式匹配中有一些特殊字符,他們有特殊的意義,Lua中的特殊字符如下:

  1. ( ) . % + - * ? [ ^ $ 

'%' 用作特殊字符的轉義字符,因此 '%.' 匹配點;'%%' 匹配字符 '%'。轉義字符 '%'不僅可以用來轉義特殊字符,還可以用于所有的非字母的字符。當對一個字符有疑問的時候,為安全起見請使用轉義字符轉義他。

Lua而言,模式串就是普通的字符串。他們和其他的字符串沒有區別,也不會受到特殊對待。只有他們被用作模式串用于函數的時候,'%' 才作為轉義字符。所以,如果你需要在一個模式串內放置引號的話,你必須使用在其他的字符串中放置引號的方法來處理,使用 '\' 轉義引號,'\' 是Lua的轉義符。你可以使用方括號將字符類或者字符括起來創建自己的字符類(譯者:Lua稱之為char-set,就是指傳統正則表達式概念中的括號表達式)。比如,'[%w_]' 將匹配字母數字和下劃線,'[01]' 匹配二進制數字,'[%[%]]' 匹配一對方括號。下面的例子統計文本中元音字母出現的次數:

  1. _, nvow = string.gsub(text, "[AEIOUaeiou]", "") 

在char-set中可以使用范圍表示字符的集合,***個字符和***一個字符之間用連字符連接表示這兩個字符之間范圍內的字符集合。大部分的常用字符范圍都已經預定義好了,所以一般你不需要自己定義字符的集合。比如,'%d' 表示 '[0-9]';'%x' 表示 '[0-9a-fA-F]'。然而,如果你想查找八進制數,你可能更喜歡使用 '[0-7]' 而不是 '[01234567]'。你可以在字符集(char-set)的開始處使用 '^' 表示其補集:'[^0-7]' 匹配任何不是八進制數字的字符;'[^\n]' 匹配任何非換行符戶的字符。記住,可以使用大寫的字符類表示其補集:'%S' 比 '[^%s]' 要簡短些。

Lua的字符類依賴于本地環境,所以 '[a-z]' 可能與 '%l' 表示的字符集不同。在一般情況下,后者包括 'ç' 和 'ã',而前者沒有。應該盡可能的使用后者來表示字母,除非出于某些特殊考慮,因為后者更簡單、方便、更高效。

可以使用修飾符來修飾模式增強模式的表達能力,Lua中的模式修飾符有四個:

  1. +      匹配前一字符1次或多次  
  2. *      匹配前一字符0次或多次  
  3. -      匹配前一字符0次或多次  
  4. ?      匹配前一字符0次或1次 

'+',匹配一個或多個字符,總是進行最長的匹配。比如,模式串 '%a+' 匹配一個或多個字母或者一個單詞:

  1. print(string.gsub("one, and two; and three", "%a+", "word"))  
  2.     --> word, word word; word word 

'%d+' 匹配一個或多個數字(整數):

  1. i, j = string.find("the number 1298 is even", "%d+")  
  2. print(i,j)    --> 12  15 

'*' 與 '+' 類似,但是他匹配一個字符0次或多次出現.一個典型的應用是匹配空白。比如,為了匹配一對圓括號()或者括號之間的空白,可以使用 '%(%s*%)'。( '%s*' 用來匹配0個或多個空白。由于圓括號在模式中有特殊的含義,所以我們必須使用 '%' 轉義他。)再看一個例子,'[_%a][_%w]*' 匹配Lua程序中的標示符:字母或者下劃線開頭的字母下劃線數字序列。

'-' 與 '*' 一樣,都匹配一個字符的0次或多次出現,但是他進行的是最短匹配。某些時候這兩個用起來沒有區別,但有些時候結果將截然不同。比如,如果你使用模式 '[_%a][_%w]-' 來查找標示符,你將只能找到***個字母,因為 '[_%w]-' 永遠匹配空。另一方面,假定你想查找C程序中的注釋,很多人可能使用 '/%*.*%*/'(也就是說 "/*" 后面跟著任意多個字符,然后跟著 "*/" )。然而,由于 '.*' 進行的是最長匹配,這個模式將匹配程序中***個 "/*" 和***一個 "*/" 之間所有部分:

  1. test = "int x; /* x */ int y; /* y */" 
  2. print(string.gsub(test, "/%*.*%*/", "<COMMENT>"))  
  3.     --> int x; <COMMENT> 

然而模式 '.-' 進行的是最短匹配,她會匹配 "/*" 開始到***個 "*/" 之前的部分:

  1. test = "int x; /* x */ int y; /* y */" 
  2. print(string.gsub(test, "/%*.-%*/", "<COMMENT>"))  
  3.     --> int x; <COMMENT> int y; <COMMENT> 

'?' 匹配一個字符0次或1次。舉個例子,假定我們想在一段文本內查找一個整數,整數可能帶有正負號。模式 '[+-]?%d+' 符合我們的要求,它可以匹配像 "-12"、"23" 和 "+1009" 等數字。'[+-]' 是一個匹配 '+' 或者 '-' 的字符類;接下來的 '?' 意思是匹配前面的字符類0次或者1次。

與其他系統的模式不同的是,Lua中的修飾符不能用字符類;不能將模式分組然后使用修飾符作用這個分組。比如,沒有一個模式可以匹配一個可選的單詞(除非這個單詞只有一個字母)。下面我將看到,通常你可以使用一些高級技術繞開這個限制。

以 '^' 開頭的模式只匹配目標串的開始部分,相似的,以 '$' 結尾的模式只匹配目標串的結尾部分。這不僅可以用來限制你要查找的模式,還可以定位(anchor)模式。比如:

  1. if string.find(s, "^%d") then ... 

檢查字符串s是否以數字開頭,而

  1. if string.find(s, "^[+-]?%d+$") then ... 

檢查字符串s是否是一個整數。

'%b' 用來匹配對稱的字符。常寫為 '%bxy' ,x和y是任意兩個不同的字符;x作為匹配的開始,y作為匹配的結束。比如,'%b()' 匹配以 '(' 開始,以 ')' 結束的字符串:

  1. print(string.gsub("a (enclosed (in) parentheses) line", "%b()", ""))  
  2. --> a line 

常用的這種模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字符作為分隔符。

小結:關于Lua模式匹配學習教程的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 博客園
相關推薦

2011-08-24 14:14:13

LUA環境 配置

2011-08-23 16:37:05

Lua數學庫

2011-08-25 15:41:42

Lua源碼

2011-08-24 15:42:38

LUA源代碼

2011-08-24 15:34:44

MinGWLua環境配置

2011-08-24 17:09:35

LUA閉包函數

2011-08-24 11:08:09

Lua

2011-08-25 16:20:33

Lua腳本變量

2011-08-23 17:06:03

2011-08-24 13:27:07

Lua 游戲C接口腳本

2011-08-23 16:48:41

Lua 5.1API 函數

2011-08-23 13:54:10

LUA全局變量

2011-08-23 15:57:21

Lua元表元方法

2011-08-23 13:27:46

Luaglobal變量

2010-07-26 10:51:26

Perl模式匹配

2011-08-23 10:29:13

LuaPlayer

2011-08-23 17:33:08

LuaMetatable

2011-08-25 17:01:50

LUA網游游戲

2011-08-24 11:03:33

LUA環境 安裝

2010-07-21 13:27:06

Perl模式匹配
點贊
收藏

51CTO技術棧公眾號

欧美日韩极品在线观看一区| 日韩理论片网站| 欧美第一淫aaasss性| 麻豆av免费在线| 欧美人成免费网站| 欧美精品卡一卡二| 一区免费在线| 国产精品视频xxx| 高清不卡一区| 日韩欧美在线字幕| 少妇性l交大片| 国产成人精品亚洲777人妖| 91视频国产精品| 老牛影视av一区二区在线观看| 精品视频在线观看日韩| 人人九九精品| 色一情一伦一子一伦一区| 成人网18免费看| 久久久99久久| 日韩在线综合网| 久久久噜噜噜久噜久久综合| 午夜在线视频免费观看| 亚洲日韩成人| 精品一区2区三区| 亚洲一卡久久| 日韩精品伦理第一区| 激情欧美国产欧美| 丁香婷婷久久久综合精品国产| 成人在线视频免费观看| 国产精品国产三级国产aⅴ浪潮 | 色中色综合网| 91久久久久久国产精品| 亚洲影视一区| 国产视频精品网| 老司机免费视频一区二区| 亚洲无玛一区| 91在线播放网址| 香艳视频网站| 91国偷自产一区二区三区观看| 欧美日韩激情视频一区二区三区| 美女一区二区久久| 91丨porny丨探花| 久久久久久婷| 熟妇熟女乱妇乱女网站| 99国产精品视频免费观看| 啦啦啦在线视频免费观看高清中文| 亚洲欧洲韩国日本视频| 岛国大片在线观看| 中文字幕精品一区二区精品| 在线日韩成人| 99蜜桃在线观看免费视频网站| 日韩国产在线一| 爆操妹子视频在线观看| 久久综合九色综合欧美狠狠| 国产精品99久久久久久www| 色尼玛亚洲综合影院| 亚洲综合成人在线视频| 精品日本一区二区三区在线观看| 国产a久久精品一区二区三区| 午夜精品爽啪视频| 国产av人人夜夜澡人人爽| 99精品视频免费| 欧美亚洲另类激情另类| 日韩精品中文字幕一区二区| 成人福利视频网| 国内欧美视频一区二区| 最色在线观看| 国内精品视频一区二区三区八戒| 日韩国产小视频| 亚洲香蕉在线观看| 久久精品国产福利| 亚洲在线视频网站| 天天爽人人爽夜夜爽| 国自产拍偷拍福利精品免费一 | 国产一区二区三区免费观看在线| 久久露脸国产精品| 亚洲澳门在线| 亚洲国产精品日韩| 欧美精品一区二区三区在线播放| 日韩手机在线| 国产精品一区视频网站| 日本va欧美va欧美va精品| 欧美大胆性生话| 5g影院天天爽成人免费下载| 免费视频最近日韩| 黄色影院一级片| 在线观看免费一区| 精品久久久久久久久久久久包黑料 | 日韩欧美在线网站| 狠狠色丁香久久综合频道| 久草在线资源视频在线观看| 日韩精品在线影院| av一区二区高清| 美女欧美视频在线观看免费| 成人久久久久久久| 日韩毛片一区| 欧美日韩一区在线视频| 欧美三级日本三级少妇99| 95精品视频| 免费高清一区二区三区| 九九精品视频在线| 亚洲婷婷在线视频| 国产欧美在线| 成人影院网站ww555久久精品| 羞羞的视频免费| 国产精品免费在线播放| 久久精品欧美一区| 国产精品一区二| 亚洲天堂av高清| 天涯成人国产亚洲精品一区av| 99精品国产福利在线观看免费| 三级在线看中文字幕完整版| 91婷婷韩国| 亚洲国产欧美不卡在线观看| 91国在线精品国内播放| 在线观看视频一区二区| 日本一区二区三区视频视频| 在线日韩中文| 国产suv精品一区| 日本中文字幕伦在线观看| 日韩美女爱爱视频| 欧美主播福利视频| 亚洲国产精品国自产拍av秋霞| 18欧美乱大交hd1984| 激情综合久久| 国产高清一区二区| 国产污视频在线播放| 国产精品ⅴa有声小说| 白虎精品一区| 欧美精品aaaa| 日韩毛片在线免费看| 粉嫩av一区二区三区天美传媒| 国产91色在线|亚洲| 国产美女扒开尿口久久久| 欧美在线播放视频| 久久久久一本一区二区青青蜜月| 亚洲欧洲免费视频| 亚洲人午夜精品| 日韩亚洲欧美高清| 日韩欧美国产1| 亚洲а∨天堂久久精品9966| 欧美午夜影院一区| 欧美日韩精品欧美日韩精品一| 亚洲欧美自拍偷拍| 免费成人美女在线观看| 亚洲视频免费| 久久电影一区| 国产自产高清不卡| 国产欧美1区2区3区| 亚洲高清久久久| 欧美日韩一区不卡| 在线视频国产一区| 欧美精品一区二区在线播放| 国产香蕉一区二区三区在线视频 | 国内精品伊人久久久久影院对白| 日本欧美一区二区三区| 国产精品婷婷| 另类综合日韩欧美亚洲| 国产99一区视频免费| 97超碰欧美中文字幕| 婷婷久久综合九色国产成人| 午夜成人免费视频| 欧美在线一区二区| 国产一区二区三区视频免费| 欧美大肥婆大肥bbbbb| 亚洲精品久久久久久久久久久久| www.国产精品一二区| 欧美亚洲另类制服自拍| 免费观看成人高| 99不卡视频| www.在线视频| 日韩欧美不卡| 久久精品男人的天堂| 欧美视频第一页| 久久精品国产亚洲一区二区| 福利精品视频| 成人毛片一区二区| 日本蜜桃在线观看| 精品国产中文字幕第一页| 视频一区视频二区在线观看| 亚洲综合无码一区二区| 日韩在线视频国产| 亚洲自拍小视频| 成人看片app| 不卡av免费观看| 亚洲精品四区| 欧美性色19p| 国产精品久久久久久久久免费 | 国产成人精品免费网站| 欧美日韩精品系列| 欧美亚洲日本黄色| 国产精品久久久毛片| 大菠萝精品导航| 日本vs亚洲vs韩国一区三区二区 | 亚洲在线观看视频| www午夜视频| 欧美日韩女优| 国产欧美精品在线观看| 欧美另类69精品久久久久9999| 欧美成人免费在线|