lua-正则表达式
前篇
Lua 中的正则表达式
正则表达式由元字符按照规则(语法)组成。lua中的特殊字符是%.^$+-*?,一共12个。它们和一般字符按规则构成了lua的正则表达式。
元字符 |
描述 |
表达式实例 |
完整匹配的字串 |
字符 |
|
|
|
普通字符 |
除去%.^$*+-?的字符,匹配字符本身 |
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 |
空白符[ \r\n\t\v\f] |
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(x2)) 2(3+4(x2)) |
备注 1. lua不支持分组后面接重复词(+*?),对于复杂的匹配可以用find+循环手动处理。 2. %bxy跟预定义字符集有区别,前者在[…]仍保持原意,后者则失去特殊意义 3. 上表中是lua对正则的支持,其他的正则如命名组,重复{m, n}等并不能在lua中用。注意转义字符是%不是\
参考
- Lua5.1参考手册
- python正则表达式指南(By AstralWind)
- 正则表达式30分钟入门教程(By deerchao)