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