與其他腳本語言不同的是,lua 并不使用符合 posix 規範的正規表達式(也寫作 regexp)來進行模式比對。然而,lua 中的模式比對功能是很強大的,并且包含了一些标準 posix 模式比對不容易實作的功能。
用于模式比對的模式串的構成:
字元類 -- 指可以比對一個特定字元集合内任何字元的模式項。
<a href="http://my.oschina.net/moooofly/blog/112446#">?</a>
1
2
3
4
5
6
7
8
9
10
11
<code>. 任意字元</code>
<code>%a 字母</code>
<code>%c 控制字元</code>
<code>%d 數字</code>
<code>%l 小寫字母</code>
<code>%p 标點字元</code>
<code>%s 空白符</code>
<code>%u 大寫字母</code>
<code>%w 字母和數字</code>
<code>%x 十六進制數字</code>
<code>%z 代表0的字元</code>
上面字元類的大寫形式表示小寫所代表的集合的補集。
特殊字元 - 模式比對中的特殊字元
<code>( ) . % + - * ? [ ^ $</code>
'%' 用作特殊字元的轉義字元,是以 '%.' 比對點;'%%' 比對字元 '%'。轉義字元 '%'不僅可以用來轉義特殊字元,還可以用于所有的非字母的字元。當對一個字元有疑問的時候,為安全起見請使用轉義字元轉義他。
如果你需要在一個模式串内放置引号的話,你必須使用在其他的字元串中放置引号的方法來處理,使用 '\' 轉義引号,'\' 是 lua 的轉義符。
可以使用方括号将字元類或者字元括起來建立自己的字元類(或稱之為 char-set)。比如,'[%w_]' 将比對字母數字和下劃線,'[01]' 比對二進制數字,'[%[%]]' 比對一對方括号。
在 char-set 中可以使用範圍表示字元的集合,第一個字元和最後一個字元之間用連字元連接配接表示這兩個字元之間範圍内的字元集合。
可以在字元集(char-set)的開始處使用 '^' 表示其補集:'[^0-7]' 比對任何不是八進制數字的字元;'[^\n]' 比對任何非換行符戶的字元。記住,可以使用大寫的字元類表示其補集:'%s' 比 '[^%s]' 要簡短些。
lua的字元類依賴于本地環境,是以 '[a-z]' 可能與 '%l' 表示的字元集不同。
模式修飾符 - 可以使用修飾符來修飾模式增強模式的表達能力
<code>+ 比對前一字元1次或多次</code>
<code>* 比對前一字元0次或多次</code>
<code>- 比對前一字元0次或多次</code>
<code>? 比對前一字元0次或1次</code>
'+',比對一個或多個字元,總是進行最長的比對。
'*' 與 '+' 類似,但是他比對一個字元0次或多次出現.一個典型的應用是比對空白。
'-' 與 '*' 一樣,都比對一個字元的0次或多次出現,但是進行的是最短比對。
'?' 比對一個字元0次或1次。
以 '^' 開頭的模式隻比對目标串的開始部分,相似的,以 '$' 結尾的模式隻比對目标串的結尾部分。這不僅可以用來限制你要查找的模式,還可以定位(anchor)模式。
'%b' 用來比對對稱的字元。常寫為 '%bxy' ,x和y是任意兩個不同的字元;x作為比對的開始,y作為比對的結束。常用的這種模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字元作為分隔符。
============== 2013年3月9日 更新 ==================
capture 機制 - 可以使用模式串的一部分比對目标串的一部分。将你想捕獲的模式用圓括号括起來,就指定了一個capture。
例如,在string.find使用captures的時候,函數會傳回捕獲的值作為額外的結果。這常被用來将一個目标串拆分成多個: