与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有更能。然而,Lua中的模式匹配功能是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。 Lua正则中的特殊字符(元字符)包括如下几种:( ) . % + - * ?[ ] ^ $ lua正则支持其大写形式,大写形式代表非,即有%A = ^%a,%A表示与任意非字母配对。
元字符 | 描述 | 表达式实例 | 完整匹配的字串 |
---|---|---|---|
字符 | |||
普通字符 | 除去%.[]()^$*+-?的字符,匹配字符本身 | Kana | Kana |
. | 匹配任意字符 | Ka.a | Kana |
% | 转义字符,改变后一个字符的原有意思。当后面的接的是特殊字符时,将还原特殊字符的原意。%和一些特定的字母组合构成了lua的预定义字符集。%和数字1~9组合表示之前捕获的分组 | K%wna %%na%% (a)n%1 |
Kana %na% ana |
[...] | 字符集(字符类)。匹配一个包含于集合内的字符。[...]中的特殊字符将还原其原意,但有下面几种特殊情况 1. %],%-,%^作为整体表示字符']','-','^' 2. 预定义字符集作为一个整体表示对应字符集 3. 当]位于序列的第一个字符时只表示字符']' 4. 形如[^...],[...-...]有特定的其他含义 |
[a%]na [%a]na [%%a]na []]na [%]]na [a-]na |
%na wna wna ]na ]na -na |
[...-...] | -表示ascii码在它前一个字符到它后一个字符之间的所有字符 | [a-z]a | na |
[^...] | 不在...中的字符集合。 | [^0-9]na [^^0-9]na |
Kna Kna |
重复(数量词) | |||
* | 表示前一个字符出现0次或多次 | [0-9]* [a-z]*9* |
2009 na |
+ | 表示前一个字符出现1次或1次以上 | n+[0-9]+ | n2009 |
? | 表示前一个字符出现0次或1次 | n?[0-9]+ | 2009 |
预定义字符集 | |||
%s | 空白符[ vf] | an[%s]?9 | an 9 |
%p | 标点符号 | an[%p]9 | an.9 |
%c | 控制字符 | ||
%w | 字母数字[a-zA-Z0-9] | [%w]+ | Kana9 |
%a | 字母[a-zA-Z] | [%a]* | Kana |
%l | 小写字母[a-z] | - | |
%u | 大写字母[A-Z] | - | |
%d | 数字[0-9] | - | |
%x | 16进制数[0-9a-fA-F] | - | |
%z | ascii码是0的字符 | - | |
分组 | |||
(...) | 表达式中用小括号包围的子字符串为一个分组,分组从左到右(以左括号的位置),组序号从1开始递增。 | ab(%d+) (%d+)%1 |
ab233 123123 |
边界匹配(属于零宽断言) | |||
^ | 匹配字符串开头 | ^(%a)%w* | abc123 |
$ | 匹配字符串结尾 | %w*(%d)$ | abc123 |
%b | |||
%bxy | 平衡匹配(匹配xy对)。这里的x,y可以是任何字符,即使是特殊字符也是原来的含义,匹配到的子串以x开始,以y结束,并且如果从x开始,每遇到x,计算+1,遇到y计数-1,则结束的y是第一个y使得计数等于0。就是匹配成对的符号,常见的如%b()匹配成对的括号 | %b() %d+%b() |
(3+4(x*2)) 2(3+4(x*2)) |