最近再学ulua,记录下
lpeg:基本用来处理字符串的,
local lpeg=require “lpeg”
local p=lpeg。P//匹配一个字符串
local s=lpeg。S//匹配一个集合
local r=lpeg。R//匹配一个范围内的数或者字母
lpeg。match(des,sources)//拿des和sou的第一个字符串进开始行匹配,完全一样则返回des的长度加1,否则直接返回nil
上面的方式默认用的是p的形式
等于lpeg。match(p“des”,sources) p:math(sources)
例子:lpeg。match(p“des”,“des1”)--->4
lpeg。match(s“des”,“des1”)---》2
第一不匹配的话直接返回nil
2.想匹配一样的字符串很多个的时候可以用^
lpeg。match(“a”^1,“aabb”)---》3
lpeg。match(“a”^-1,“aabb”)---》2
lpeg。match(“a”^-1,“baabb”)---》1
当为-1的时候是匹配1或者0个 没匹配到返回1,匹配到了返回2
3.假如想找a后面多个b的情况
lpeg。match(“a”דb”^1,“aabb”)---》错误不能这样写
lpeg。match(p“a”×p“b”^1,“aabb”)---》不能省略输出 nil 匹配失败
lpeg。match(p“a”×p“b”^1,“abb”)--》4
lpeg。match(s“a”×s“b”^1,“abb”)--》4 --s失败了,这样的表达式不支持整体
lpeg。match(p“a”^-1*p“b”^1,“aabb”)-->nil --第一个不影响什么,第二个要B的时候匹配失败
4.+号表示匹配任意一个
lpeg。match(“a”+"b","a")--失败,不能省略的写
lpeg。match(p“a”+p"b","a")--成功为2
lpeg。match(p(“a”+"b"),"a")--失败,没有所谓的结合律
lpeg。match(p“a”^1+p"b"^1,"aaabbb")--3 匹配A成功并且有3个
lpeg。match(p“a”^-1+p"b"^1,"caaabbb")--1因为永远满足条件
lpeg。match(r"09"^1,"45611")--匹配任意个数字
5.有了匹配肯定有捕获
c=lpeg。C(lpeg。R“09”^1,"456")--返回456
c=lpeg。C(s“+-”^1*lpeg。R“09”^1,"+456")--返回+456
c=lpeg。C(s“+-”^-1*lpeg。R“09”^1,"+-456")--错误
c=lpeg。C(p“+-”^1*lpeg。R“09”^1,"+456")--错误
c=lpeg。C(p“+-”^1*lpeg。R“09”^1,"+-456")--前面的表达式必须完全一致 +-456
想要任意一个表达式的时候用S,如果想完全一样则用P
6.特殊的/,将会把结果赋值给一个函数或者是table
ru:
local temp=lpeg。C((s“+-”^1*lpeg。R“09”^1)/tonumber,"-456")+1=== -455
也可以返回多个捕获
ru:
print(lpeg。C(“a”^1)*lpeg。C("b"^1),"aabbcc")--这里测试只会输出aa,不会输出bb 如果开头没有匹配到aa那么直接返回nil