【正则】Lua中的正则表达式

Lua中支持的匹配:

参考资料:
菜鸟教程
博客园:Lua的字符串匹配与正则表达式

元字符 描述
. 与任何字符配对
%a 与任何字母配对
%c 与任何控制符配对(例如\n)
%d 与任何数字配对
%u 与任何大写字母配对A-Z
%l 与任何小写字母配对a-z
%p 与任何标点配对
%s 与空白字符配对
%w 与任何字母/数字配对
%x 匹配十六进制数字
%z 与任何代表0的字符配对
% 特殊字符的转义字符例如:%.为匹配点号,%%为匹配百分比符号,跟\"用来转义引号类似
() 匹配与返回括号内的内容
[] 自定义匹配字符集,例如:"[a-z0-9,%]"匹配a-z、0-9、逗号以及百分比号
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次,最长匹配
- 匹配前一字符0次或多次,最短匹配
? 匹配前一字符0次或1次
^ 匹配字符串开头,例如:"^%d+"为以数字开头的匹配
$ 匹配字符串结尾,例如:"%d+$"为以数字结尾的匹配

Lua中常用的正则API:

string.gmatch():

返回一个迭代器函数。 每次调用这个函数都会继续以 pattern 对 s 做匹配,并返回所有捕获到的值。

下面这个例子会循环迭代字符串 s 中所有的单词, 并逐行打印:

 local s = "hello world from Lua"
 for w in string.gmatch(s, "%a+") do
     print(w)
 end
--输出hello
--输出world 
--输出from 
--输出Lua

注意pattern是每一次迭代中匹配的正则表达式,若本次匹配返回了多个值,则for循环中也会拿到每个值,如:

local s = "<k1=v1 k2=v2>abc<k4=v4 k5=v5 k6=v6>efg"
for v1,v2 in string.gmatch(s, "<(.-) (.-)>") do
    print('v1=',v1,'v2=',v2)
end
--输出 v1= k1=v1  v2= k2=v2
--输出 v1= k4=v4  v2= k5=v5 k6=v6

上述正则表达式 <(.-) (.-)> 可以理解为捕获以两个尖括号包围的内容,且每次捕获的结果中,都以一个空格隔开,小括号中的点号和减号表示匹配任意字符(最短匹配), 上述字符串s满足这个规则的有两个匹配,所以输出了两次,注意第二次输出时,v2是 k5=v5 k6=v6 因为当前正则表达式只匹配一个空格,多出来的空格就不管了。

猜你喜欢

转载自blog.csdn.net/weixin_37658157/article/details/128847060