Lua正則表示式(精簡而不失大師風範)
正則表示式作為一種通用的算式,大量用於文字處理邏輯中,其主要好處是速度能夠達到極致,而且程式碼量通常會非常少,本篇主要介紹lua中的正則使用,由於這樣的文章網上隨處都可以搜到,而且不乏整理的不錯的,這裡就不想再重新做這件事情。
正則表示式主要處理匹配問題,即通過給定語義萬用字元串,返回匹配成功的字串列表。
在匹配的基礎上,正則引擎往往提供了字串的查詢、替換、分割等功能,lua支援查詢與替換,但不支援分割,分割函式可以在已有介面上進行擴充套件,附錄中引用了lua社群的實現程式碼。
本篇單純的簡要介紹lua的匹配問題。
Lua正則中的特殊字元(元字元)包括如下幾種:
( ) . % + - * ?[ ] ^ $
轉義字元(元字元%):
'%' 用作特殊字元的轉義字元,'%.' 匹配點;'%%' 匹配字元 '%',’%’與特定字母結合有特定含義(萬用字元),如下:
%a: 與任何字母配對
%c: 與任何控制符配對(例如\n)
%d: 與任何數字配對
%l: 與任何小寫字母配對
%p: 與任何標點(punctuation)配對
%s: 與空白字元配對
%u: 與任何大寫字母配對
%w: 與任何字母/數字配對
%x: 與任何十六進位制數配對
%z: 與任何代表0的字元配對
對於上面的%x(其中x代表a,c,d,...,z),lua正則支援其大寫形式,大寫形式代表非%x,即有%X = ^%x,比如%A表示與任意非字母配對。
其他萬用字元(元字元.):
.(點): 與任何字元配對
字符集(元字元[]):
出了上面提到的萬用字元,我們還可以自定義字符集,如[%a%d]就是與字母和數字配對,我們還可以使用’-‘符號來指定一個範圍,如[0-7]表示[01234567],[a-z]表示小寫字母,通過字符集,我們可以定義其他複雜的萬用字元。
貪婪與吝嗇(元字元+、-、?、*)
+ 匹配前一字元1次或多次
* 匹配前一字元0次或多次
- 匹配前一字元0次或多次
? 匹配前一字元0次或1次
元字元+和*是貪婪的,總是進行最長的匹配,而-則是吝嗇的,總是進行最短匹配,注意元字元-可以匹配0次。例子:
待匹配的字串:<font>a</font><font>b</font>
模式串(1):<font>.+</font>此時將匹配整個字串,貪婪模式下,正則引擎即使發現了第一個匹配,也不會停止,因此效率相對較低。
模式串(2):<font>.-</font>此時將依次匹配<font>a</font>、<font>b</font>,最短匹配模式下,一旦正則引擎發現第一個匹配就停止動作,不會繼續匹配,
開頭與結尾(元字元^、$)
^x表示非x,可以理解為正則引擎發現了x字元,那麼就可以從這裡作為一個匹配的開頭,匹配過程中可能希望有多個開頭(特別是吝嗇模式),這個符號用的頻率會比較高,x$表示以x結尾,這裡的結尾指的是整個待匹配字串的最後一個字元,這個符號使用的場合和頻率相對會比較少。
取己所需(元字元())
圓括號是一個很好用的元字元,如上<font>a</font>,如果我們只是想讓lua正則引擎返回字元a,可以採用模式<font>(.+)</font>,否則它會返回整個字串。
關注演算法公眾號:acm-clan