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 因为当前正则表达式只匹配一个空格,多出来的空格就不管了。