Lua 模式匹配

Lua 字串庫不是使用正規表示式,而是在語法匹配中使用一組特殊字元。兩者都可以非常相似,但 Lua 模式匹配更有限,並且具有不同的語法。例如,字元序列 %a 匹配任何字母,而其大寫版本代表所有非字母字元,所有字元類(作為模式,可以匹配一組專案的字元序列)列在下面。

人物類 匹配部分
%一個 字母(AZ, az)
%C 控制字元(\ n,\ t,\ r,…)
%d 數字(0-9)
%L 小寫字母(az)
%p 標點字元(!,?,&,…)
%S 空間人物
%u 大寫字母
%(重量) 字母數字字元(AZ,az,0-9)
%X 十六進位制數字(\ 3,\ 4,…)
%Z 表示為 0 的字元
匹配任何角色

如上所述,這些類的任何大寫版本都代表了類的補充。例如,%D 將匹配任何非數字字元序列:

string.match("f123", "%D")          --> f

除了字元類,一些字元還具有特殊的函式作為模式:

( ) % . + - * [ ? ^ $

字元 % 表示字元轉義,使得 %? 匹配審訊,%% 匹配百分比符號。你可以將 % 字元與任何其他非字母數字字元一起使用,因此,如果你需要轉義,例如引用,你必須在它之前使用 \\ ,它會從 lua 字串中轉義任何字元。

在方括號([])中表示的字符集允許你建立一個特殊的字元類,組合不同的類和單個字元:

local foo = "bar123bar2341"
print(foo:match "[arb]")            --> b

你可以通過 ^ 啟動它來獲得字符集的補充 :

local foo = "bar123bar2341"
print(string.match(foo, "[^bar]"))  --> 1

在這個例子中,string.match 將找到第一次出現的不是 bar

在重複/可選修飾符的幫助下,模式可能更有用,lua 中的模式提供以下四個字元:

字元 修改
+ 一次或多次重複
* 零次或多次重複
- 也是零次或多次重複
可選(零次或一次)

字元+表示序列中的一個或多個匹配字元,它將始終返回最長匹配的序列:

local foo = "12345678bar123"
print(foo:match "%d+")  --> 12345678

正如你所看到的,* 類似於 + ,但它接受零次出現的字元,通常用於匹配不同模式之間的可選空格。

字元 - 也類似於 * ,但它不是返回最長的匹配序列,而是匹配最短的序列。

修飾符 ? 與可選字元匹配,允許你匹配例如負數:

local foo = "-20"
print(foo:match "[+-]?%d+")

Lua 模式匹配引擎提供了一些額外的模式匹配項: