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