Lua匹配模式
什么是匹配模式
匹配模式也是一串字符串内容,能通过zm.RegExMatch 正则匹配、zm.RegExMatchEx 正则子匹配、zm.RegExReplace 正则替换等函数命令实现按规则描述提取指定数据内容。
与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式(也写作RegExp)来进行匹配,而是进行了一些精简优化来实现强大的功能。
语法
字符类
字符类用于表示一个字符集合。
.
(一个点) : 可表示任何字符。%a
: 表示任何字母。%c
: 表示任何控制字符。%d
: 表示任何数字。%g
: 表示任何除空白符外的可打印字符。%l
: 表示所有小写字母。%p
: 表示所有标点符号。%s
: 表示所有空白字符。%u
: 表示所有大写字母。%w
: 表示所有字母及数字。%x
: 表示所有 16 进制数字符号。%z
: 表示 \0 的字符。%%
: 表示字符 %。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个%
放在模式串中表示自身。[
set]
: 表示 set 中所有字符的联合。 可以以-
连接,升序书写范围两端的字符来表示一个范围的字符集。 其它出现在 set 中的字符则代表它们自己。 例如,[%w\_]
(或[\_%w]
) 表示所有的字母数字加下划线),[0-7]
表示 8 进制数字,[0-7%l%-]
表示 8 进制数字加小写字母与-
字符。[^
set]
: 表示 set 的补集,也就是不包含 set , 其中 set 如上面的解释。
所有单个字母表示的类别(%a
,%c
,等), 若将其字母改为大写,均表示对应的补集。 例如,%S
表示所有非空格的字符。
模式条目
- 单个字符类匹配该类别中任意单个字符
- 单个字符类跟一个
*
, 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串 - 单个字符类跟一个
+
, 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串; - 单个字符类跟一个
-
, 将匹配零或更多个该类的字符。 和*
不同, 这个条目总是匹配尽可能短的串; - 单个字符类跟一个
?
, 将匹配零或一个该类的字符。 只要有可能,它会匹配一个; %n
, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。%b
xy, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目%b()
可以匹配到括号平衡的表达式。%f[
set]
, 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 '\0' 一样。
模式
模式 指 一个模式条目的序列。 在模式最前面加上符号 ^
将锚定从字符串的开始处做匹配。 在模式最后面加上符号 $
将使匹配过程锚定到字符串的结尾。 如果 ^
和 $
出现在其它位置,它们均没有特殊含义,只表示自身。
捕获
模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 (a*(.)%w(%s*))
, 字符串中匹配到 a*(.)%w(%s*)
的部分保存在第一个捕获物中 (因此是编号 1 ); 由 .
匹配到的字符是 2 号捕获物, 匹配到 %s*
的那部分是 3 号。
作为一个特例,空的捕获 ()
将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 ()aa()
作用到字符串 "flaaap" 上,将产生两个捕获物: 3 和 5 。