openresty中lua正则匹配

背景

  • lua 中的正则和标准的正则是不同的,Lua并不使用POSIX规范的正则表达式(也写作regexp)来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有更能。然而,Lua中的模式匹配功能是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。

元字符

lua中元字符一共有:%.^$*+-?

元字符 描述 表达式实例 匹配的字符串
普通字符 除去%.^$*+-?的字符,匹配字符本身 Kana Kana
. 匹配任意字符 Ka.a Kana,Ka2a
^ 匹配字符串开头 ^(%a)%w* abc123
$ 匹配字符串结尾 %w*(%d)$ abc123
* 表示前一个字符出现0次或多次,贪婪 [0-9]* 2009,2,23
+ 表示前一个字符出现1次或1次以上 n+[0-9]+ n2009,nn99
- 表示前一个字符出现0次或多次,非贪婪 b[a-z]-c bacaac 中只会匹配出:bac 而不是 bacaac
? 表示前一个字符出现0次或1次 n?[0-9]+ 2009
() 表达式中用小括号包围的子字符串为一个分组,分组从左到右(以左括号的位置),组序号从1开始递增,使用场景:替换掉匹配字符串中的一部分 ab(%d+) ab233
% 转义字符,%和一些特定的字母组合构成了lua的预定义字符集。%和数字1~9组合表示之前捕获的分组 K%wna Kana,K9na
%%表示匹配% %%na%% %na%
%1表示再次匹配第一个分组,也就是说 (a)%1等价于(a)(a) (a)%1(b)x%2 aabxb
%s ,空白字符(比如空格,tab啊) an[%s]?9 an 9
%p ,标点符号 an[%p]9 an.9
%c ,控制字符 例如\n
%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的字符 -
[] 字符集(字符类)。匹配一个包含于集合内的字符。[...]中的特殊字符将还原其原意,但有下面几种特殊情况 [a%%]na %na,ana
%],%-,%作为整体表示字符']','-','' [%a]na wna,bna,Bna
预定义字符集作为一个整体表示对应字符集 [%%a]na %na,ana
[-] ,-表示ascii码在它前一个字符到它后一个字符之间的所有字符,如:[a-zA-Z0-9] [a-z]na ana,bna…..zna
[^] ,不在...中的字符集合。 如:[^a],表示a以外的任意字符 [^0-9]na Kna

总结

  • 不要用标准正则来写匹配规则!如:想要非贪婪匹配直接写个?
posted @ 2023-06-04 16:33  Klay_zhu  阅读(168)  评论(0)    收藏  举报