與其餘腳本語言不一樣的是,Lua 並不使用符合 POSIX 規範的正則表達式(也寫做 regexp)來進行模式匹配。然而,Lua 中的模式匹配功能是很強大的,而且包含了一些標準 POSIX 模式匹配不容易實現的功能。
用於模式匹配的模式串的構成:
字符類 -- 指能夠匹配一個特定字符集合內任何字符的模式項。
. 任意字符
%a 字母
%c 控制字符
%d 數字
%l 小寫字母
%p 標點字符
%s 空白符
%u 大寫字母
%w 字母和數字
%x 十六進制數字
%z 表明0的字符
上面字符類的大寫形式表示小寫所表明的集合的補集。
特殊字符 - 模式匹配中的特殊字符
( ) . % + - * ? [ ^ $
'%' 用做特殊字符的轉義字符,所以 '%.' 匹配點;'%%' 匹配字符 '%'。轉義字符 '%'不只能夠用來轉義特殊字符,還能夠用於全部的非字母的字符。當對一個字符有疑問的時候,爲安全起見請使用轉義字符轉義他。
若是你須要在一個模式串內放置引號的話,你必須使用在其餘的字符串中放置引號的方法來處理,使用 '\' 轉義引號,'\' 是 Lua 的轉義符。
可使用方括號將字符類或者字符括起來建立本身的字符類(或稱之爲 char-set)。好比,'[%w_]' 將匹配字母數字和下劃線,'[01]' 匹配二進制數字,'[%[%]]' 匹配一對方括號。
在 char-set 中可使用範圍表示字符的集合,第一個字符和最後一個字符之間用連字符鏈接表示這兩個字符之間範圍內的字符集合。
能夠在字符集(char-set)的開始處使用 '^' 表示其補集:'[^0-7]' 匹配任何不是八進制數字的字符;'[^\n]' 匹配任何非換行符戶的字符。記住,可使用大寫的字符類表示其補集:'%S' 比 '[^%s]' 要簡短些。
Lua的字符類依賴於本地環境,因此 '[a-z]' 可能與 '%l' 表示的字符集不一樣。
模式修飾符 - 可使用修飾符來修飾模式加強模式的表達能力
+ 匹配前一字符1次或屢次
* 匹配前一字符0次或屢次
- 匹配前一字符0次或屢次
? 匹配前一字符0次或1次
'+',匹配一個或多個字符,老是進行最長的匹配。
'*' 與 '+' 相似,可是他匹配一個字符0次或屢次出現.一個典型的應用是匹配空白。
'-' 與 '*' 同樣,都匹配一個字符的0次或屢次出現,可是進行的是最短匹配。
'?' 匹配一個字符0次或1次。
以 '^' 開頭的模式只匹配目標串的開始部分,類似的,以 '$' 結尾的模式只匹配目標串的結尾部分。這不只能夠用來限制你要查找的模式,還能夠定位(anchor)模式。
'%b' 用來匹配對稱的字符。常寫爲 '%bxy' ,x和y是任意兩個不一樣的字符;x做爲匹配的開始,y做爲匹配的結束。經常使用的這種模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可使用任何字符做爲分隔符。
============== 2013年3月9日 更新
==================
Capture 機制 - 可使用模式串的一部分匹配目標串的一部分。將你想捕獲的模式用圓括號括起來,就指定了一個capture。
例如,在string.find使用captures的時候,函數會返回捕獲的值做爲額外的結果。這常被用來將一個目標串拆分紅多個:
pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name Anna
date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y) --> 17 7 1990