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 模式匹配引擎提供了一些額外的模式匹配項: