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