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 將找到第一次出現的不是 b , a 或 r 。
在重複/可選修飾符的幫助下,模式可能更有用,lua 中的模式提供以下四個字元:
| 字元 | 修改 | 
|---|---|
| + | 一次或多次重複 | 
| * | 零次或多次重複 | 
| - | 也是零次或多次重複 | 
| ? | 可選(零次或一次) | 
字元+表示序列中的一個或多個匹配字元,它將始終返回最長匹配的序列:
local foo = "12345678bar123"
print(foo:match "%d+")  --> 12345678
正如你所看到的,* 類似於 + ,但它接受零次出現的字元,通常用於匹配不同模式之間的可選空格。
字元 - 也類似於 * ,但它不是返回最長的匹配序列,而是匹配最短的序列。
修飾符 ? 與可選字元匹配,允許你匹配例如負數:
local foo = "-20"
print(foo:match "[+-]?%d+")
Lua 模式匹配引擎提供了一些額外的模式匹配項: