1. 程式人生 > >Lua正則表示式(精簡而不失大師風範)

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