00:00
在上一节的快速上手过程当中,我们实现了一个检测用户连续三次登录失败这样的一个实例,那在这个应用的过程当中,我们使用CP,其实这个流程可以看得出来是固定的,首先先去定义当前的数据流或者说事件流,然后呢就是要定义一个模式。把当前我们想要去检测匹配的那些复杂事件,他们的组合关系在这里要完整的定义出来。第三步,接下来就是把模式应用到数据流上,检测复杂事件,这个很明很显然就是非常固定化的一步调用啊CP.pattern然后把前面定义好两步定义好的一个和一个pattern传进来。那第四步呢,是处理检测到的复杂事件,这里边就是调用一个select,传一个pattern select方式实现里边的select方法就可以了,那这个不要看,好像代码比较长,事实上呢,这里边其实非常简单,就是所有检测到那个复杂事件都在这个map数据结构里边保存好了,我们想要什么信息从里边提取出来,然后包装一下输出就完事。
01:18
所以整体来看的话,这里边最复杂的一步,其实就是这里的第二步。Pattern的定义啊,那对于各种不同的需求,各种不同的业务逻辑,最复杂的也就是这里的模式会有不同的定义方式了啊,这里边我们只是以连续三次登陆失败,每一个简单事件都一样,相当于把它重复了三次,看起来比较简单,那在有一些场景里边,这里可能就是最复杂的一步。所以接下来呢,我们关键就要专门的讲一讲。定义模式的过程当中,到底还有哪些比较特殊的用法啊,那这里边。我们所说的就是CP,核心其实就是这样的一个模式匹配,那CP库里边呢,提供了这个类,它里边呢就可以有一系列的API,一系列的方法来专门去定义我们当前的匹配模式,这一套方法就叫做。
02:18
Pattern API或者模式API,所以接下来我们就专门讲一讲模式API是怎么样去用的,这里面呢又会涉及到一些比较重要的概念,首先我们来介绍一下个体模式。其实在之前我们也已经知道了所谓的复杂事件处理,做这样的一个模式匹配它匹配的复杂事件啊,那其实呢,就是一个一个的简单事件组合在一起构成的,那每一个简单事件呢。其实本身也是要有一定的选取条件的,比如说像我们这里的每一个事件都是登陆失败事件啊,那有一些场景下,可能这个本身一个简单事件的选取条件也是非常复杂的,所以这里面我们就会发现。
03:09
在这个pattern定义的过程当中,我们就可以把它看成按照先后发生顺序的这个简单事件,一个一个拆开第一个。事件第一次登陆失败,第二个事件第二次登陆失败,第三个事件第三次登陆失败。那这里边。每一个简单事件对应的这样一个定义的语法,我们就把它定义出来的单独的这个匹配规则叫做。个体模式就是针对某一个简单事件,它的选取规则定义出来的一个模式,就叫做个体模式。啊,那我们可以看到基本形式是什么样呢?其实就是要不就是前面最初的这一个begin,那这是第一个啊,它固定的一定是调这个begin方法,然后接下来加一个where,指定当前的条件,或者呢,呃,就是后面我们定义的这个是直接点next,一个连接词前后做连接的这样一个是一一个表示,然后后面再跟上当前简单事件的选取条件,所以整体来看的话,它的关键应该就是连接词加一个条件。
04:25
那这里的连接词呢,我们可以看到它其实是要把不同的个体模式要组合起来的,所以这一部分呢,涉及到了个体模式的组合,我们会放在后面专门去做介绍,诶,那这里对于个体模式的条件呢,这个看起来比较简单,这就是一个点where,然后里边传一个简单条件就就行了,那除此之外。每一个个体模式呢,它还可以增加一个量词。诶,这样的话增加一个量词,就表示每一个个体模式可以进行重复的匹配。
05:04
诶,所以我们会发现每一个个体模式呢,它可以接收一个事件,但是只能接收一个事件吗。假如说只接受一个事件的话,很显然我们之前再去对当前的检测出来的复杂事件进行处理的时候,就没有必要把它保存在一个例子里边了呀。诶,所以之所以保存在例子里边,就是因为我们知道这里边对应的每一个key,它的value其实就对应着一个个体模式检测出来的事件吗?当前的个体模式检测出来事件可以是很多个,为什么可以是很多个呢?就是因为后边可以去指定一个量词,这个量词就可以进行让当前的模式进行一个循环匹配,然后接收多个事件。所以接下来呢,我们就再展开讲一讲个体模式里边的量词,以及它条件的定义。
06:01
首先我们先来看量词啊,那所谓的这个量词呢,主要就是指当前个体模式检测出来事件循环的次数,所以从这个角度来讲呢,个体模式可以分成两类,一类是。只接收一个事件,不加量词的这种个体模式啊,那有时候就直接会把它叫做单例模式,Singleton模式。那另外呢,如果加上了量词,可以不停的循环检测到多个事件的话,这种个体模式就叫做循环模式,Lo模式。啊,那默认情况下当然就是没有量词,那就只接收一个事件了啊,那如果说定义了量词之后,接收多个事件,所有的事件就都会放到当前的这个list里边来。这也就是为什么我们接收的时候是用一个list来保存同一个个体模式对应的key。指定的。这样的一个value里边啊,是用list来表示。
07:04
在Li cp里边呢,哎,我们可以看到它可以调用各种不同的方法来指定当前的循环模式啊,那这里边我们把主要的可以定义的这种循环模式都已经列举出来了。首先比如说点one or more啊,这个其实非常简单,就是我们如果想要去定义这样一个量词的话,在当前每一个,比方说这个VR后边当前就是一个个体模式嘛,我们直接就可以调点one啊,这是完全没有问题的。所谓的one or more非常的简单,指的指的很明显,就是匹配的事件会出现一次或者多次,那假如说我们要检测的啊,这个个体模式是检测一个事件A的话,那么呃,我如果我们这里边定义这个A是一个个体模式的话,那么基于这个个体模式调a.one more,那么表示就是可以匹配一个A或者多个A这样事件的组合。
08:06
啊,那有时候我们直接简单表示的话,就用A加来表示,所以这个其实跟正则里面的表达是一样的啊啊,那另外呢,还可以是times,然后里边传一个参数,传一个整数参数,所以这就是表示匹配事件可以发循环发生整多次。比如说a.TIMES3就表示三个A连续发生三次循环,匹配三次啊AAA。那另外呢,还可以times传两个参数from to,意思就是在这个范围内出现的循环次数都是可以匹配上的,那当前比如说a.TIMES2,四的话,那就是可以匹配两个AAA,三个A或者四个A都是可以的二到四次循环匹配。这是关于这个,呃,基本这个次数的定义,当然了,另外还有一个叫做times or啊就是。
09:06
我。说我们可以指定出现一次或多次,这个是one of,那如果是出现某一个次数以上,并且可以出现更多次的话,那就是所谓的times or more啊,也就是说,比方说times or more,然后传一个二的话,那就是表示两次或者更多。这个对应的,其实根据这样一个方法名称,可以很明显的知道它到底表示的是什么含义。那除了这些之外呢,还有比较特殊的点greedy greedy我们知道是贪心贪婪的这个意思,那加上这个点greedy之后呢,就是表示。注意这个点啊,它只能定义在循环模式后面,也就是说前面加了这个times times or more,或者one or more类似的这个量词之后,后边再加一个点pretty,它表示当前的循环模式就会变得非常的贪心,诶,那也就是说尽可能多的要去匹配,能多就多,比如说如果是a.TIMES2,四,然后点的话。
10:12
那假如说现在连续出现了四个A。那我们知道连续四个A的话,那很明显前两个A这也能做一次匹配啊,因为两个也算嘛啊,然后这个中间两个A这也是一次匹配啊啊,那那前三个A这也是也是一次匹配啊,那这些都算吗?诶注意不是的,这里边是直接把AAAA4个检测出来进行处理,如果要是任意两个A,它是不会算作这样的一个匹配时间。就尽可能的多,这是ready的一个用法。另外还有一个叫做optional optional也比较简单,就是可选的,也就是说用在当前的某一个循环模式后边的话表示当前,这个条件呢,可以满足,也可以不满。
11:02
哎,那这到底表示什么含义呢?而且就是说当前的这个量词和后面这个greedy啊,Optional它分别都可以结合起来去使用啊,所以接下来我们可以看一看啊,针对某一个个体模式pattern后面添加的量词,我们把任意的情况都做一个具体的分析啊,那比如说最简单的TIMES4,那就是要匹配当前的这个事件出现四次,Pattern所要求的筛选出来的事件要重复出现四次。然后如果是四后面加了一个option的话,那表示是出现。零次或四次,就是当前这个Python不匹配也行,Optional是这个意思,可选。那如果是TIMES2次的话,表示的是二到四次,二次三次四次都是可以的,那如果后面再加一个greedy呢?诶,那就是尽可能的多,有四次就取四次就不匹配两次的啊,有三次的就不会匹配,匹配这个两次的啊,就尽可能的按照当前最多的那种情况去做匹配。
12:05
那如果后面同样加一个option呢?那就是匹配二到四次,或者干脆不出现也行。那当然了,单独有这么一个模式,后面加一个optional,我们知道这是没有意义的,它往往是出现在我们整个的前后各种各样的个体模式定义的这个过程当中啊,就一系列的事件中间,这个可出现可不出现,这就有意义了啊,那所以这个optional是在更加复杂的一个组合模式里边定义出来的。啊,那另外呢,我们看到optional和greedy还可以组合,那就假如说TIMES2次,先optional,然后再greedy,这表示什么含义呢?诶,这表示出现234次或者不出现,而且尽可能多的进行匹配啊,那另外还有就是one more也是类似的,One more后面也可以加greedy,尽可能多的匹配,也可以加optional,就是可以不出现啊,那同样也可以optional再加greedy啊,那同样另外还有意大利就是times or more,就是出现两次或者更多啊,那后面同样也可以加greedy optional optional and greedy。
13:17
这就是我们所说的这个量词的用法。所以我们会发现啊,正是因为这个循环模式的出现,我们发现定义的一个个体模式呢,可以匹配到多个事件,所以我们发现在map当中用一个list来保存每一个当前个体模式对应那个K啊,对应那个名称,保存它对应的值啊,那当前我们检测到多个事件之后,就从这个list里边去选取就可以了。如果说我们当前只有一个匹配事件的话啊,那当然就是直接GET0就完事了,这是关于量词的用法。
我来说两句