00:00
我们已经了解了个体模式,那接下来呢,我们就可以按照一定的顺序把个体模式组合连接在一起,这样的话就可以定义一个完整的匹配规则了,那所以我们把这个多个个体模式组合起来的这种模式就叫做组合模式啊,有时候呢,跟个体模式要区分的话,也把它叫做模式序列,就相当于很多个个体模式构成的一个序列。那一般情况下我们会看到啊,组合模式就是很多个不同的个体模式,用所谓的连接词连在一起之后的这个效果。这些连接词主要去指定的,其实就是当前我们所要匹配事件的先后顺序,那就是先匹配什么啊,然后后面紧跟着什么,后面还可以再跟着什么,这就是连接词所指定的内容。那接下来我们就分别来看一看啊,所谓的这些连接词分别表示什么含义?首先呢,呃,这里我们要定义一个所谓的初始模式,所有的组合模式都必须以一个初始模式开头,这就是我们所说的啊,一开始调用的是pattern这个半生对象里边的begin方法。
01:13
这样的话,它就可以返回一个pattern的实例对象,那这里呢?呃,后面要跟着一个暂行参数,它主要就是要检测我们事件流里边的基本类型,另外里边要传入一个string类型的参数,这指定的就是我们要检测的第一个个体模式的名称。有了初始模式之后,那接下来呢?诶,我们就可以继续跟在后边指定接下来要发生什么样的事件,那所以之后其实就是基于我们已经得到的pattern对象去调用pattern类里边对应的那些方法了,诶所以所有的这些方法,那就是之前我们已经看到的啊,这里有next,还有followed by,还有followed by any,以及加上否定修饰的not next not followed by等等啊,这就是我们所谓的这个连接词,他们主要就是用来让不同的个体模式连接在一起,构建组合模式使用的。
02:11
那所以这里我们会发现所谓的模式啊,我们平常在代码当中定义的模式就是一个组合模式。所以接下来我们就来看一看,真正意义上把这些个体模式连接在一起的这些组合的条件到底有哪些,这些呢?哎,我们整体来说,它所要表达的就是先后事件之间到底有怎么样的竞邻关系啊,那这就是所谓的近邻条件了,有时候也叫做连续性条件。主要就是指谁先谁后,然后呢,他们之间到底是紧挨着的,还是有可能隔了其他的事件?那在弗Li cp当中主要提供了三种不同的定理关系,首先是严格经理啊,这就是我们所说的啊,严格的按照顺序一个一个出现,中间不会有任何其他的事件。那代码当中呢,调用的就是next,之前我们所定义的连续三次检测这个登录失败事件,那中间不能隔着成功的事件,所以我们使用的就是next,表示下一个一定是失败事件。
03:15
与严格近邻对应的还有一种近邻关系,叫做宽松径啊,那宽松径邻呢,它就是只关心事件发生的先后顺序,那至于说是不是紧挨着,这个并不重要,也就是说两个先后发生的事件之间可以出现其他的事件。啊,比如说我们这里可以看这样的一个例子啊,如果是严格径邻,我们定义一个先有一个三角,后面跟着一个圆圈的话,哎,那么匹配出来的就只有这两个事件,这是我们检测出来的匹配的复杂事件。那如果说是宽松精灵呢啊,那就表示前边是三角,后边是圆圈,中间可以隔着别的事件,那这样一检测的话,那就这里的三角加圆圈和后边我们检测到这个三角加圆圈都是符合我们要求的。
04:08
对应在代码当中,如果要调用的话,那就是前面我们看到的followed by这样一个方法啊,那follow by从字面上也很好理解,就是只要跟在后面就可以啊,不需要next啊,不需要紧挨着的下一个。然后另外还有一种比较特殊的宽松径邻的方式,哎,它叫做非确定性宽松径理,那这种关系呢,就更加的宽松,它指的是什么呢?就是指可以重复使用之前已经匹配过的事件,这是什么意思呢?啊,就是像我们前面这个检测的过程当中会发现啊,如果使用宽松径离模式的话,前边我们检测到了一个三角,一个圆圈,诶,那我们看到啊,前边这是有三角吗?后边又出现了第二个圆圈,那这两个可以。匹配在一起吗?在宽松经营模式下,它是不能去做匹配的。
05:00
因为我们已经匹配的事件不能重复使用,而如果说我们定义的是非确定性宽松精灵的话,哎,那就相当于之前匹配过的事件还可以重复出现啊,比如说我们看在这里啊,定义了一个非确定性宽松径邻的前面是三角,后面是圆圈,那么我们看到除了。这个可以匹配,后面的这个可以匹配,另外呢,第一个三角和最后这个圆圈同样也可以匹配在一起啊,然后中间的这个三角和后边的圆圈也可以匹配在一起,所有的这些都可以匹配上。那如果在代码当中使用的话,那对应的就是followed by any方法。所以我们看到啊,按照这样一个近邻规则的设定,那整体来看的话就是。非确定性宽松镜灵能够筛选出的匹配事件是最多的,那严格净灵next的这种精灵条件,它筛选出的匹配事件就是最少的,而宽松竞明的条件follow by呢,筛选出的事件就介于两者之间。
06:03
这就是我们所说的三种不同的近邻条件。然后除了这三种之外呢,还有一些其他的限制条件,就是之前我们在源码里面看到的啊,还有一些否定的连接词,这就是not next和not follow。Note NEX比较简单,因为我们说NEX本身就是紧挨着的两个事件嘛,所以如果它指定了note NEX的话,那就表示前一个模式匹配到的事件后边不能跟着某种事件。啊,只要不是某种事件,它就是正常匹配,如果是的话,那就相当于当前是不能匹配上的。另外还有一个叫做not followed by not follow by这个就比较特殊了,因为我们知道followed by它表示是中间可以隔着别的事件。只要是跟在后边就行,那not followed by呢?哎,那就表示后边一定不能跟着某个事件。但是我们会发现啊,我们现在要检测的是无限的事件流,那所谓的后边不再出现某个事件,我们只要数据流永远不停止,那我们就永远不能保证它匹配到啊,那所以一般一个模式序列啊,一个组合模式最后是不能以not follow by结束的,因为我们无休无止了啊,那所以一般他呢是要这样去做一个定义,就是前面比方说要检测一个A事件。
07:23
然后呢,后边可能not followed by。B事件。接下来呢,再去检测一个C事件,它表示的含义就是。A和C这两个事件是我们要去检测的复杂事件,然后在它们之间呢,不能出现B事件,哎,所以note follow by往往表示是两个事件中间不会出现某种事件。除了not的这种限制之外,否定性的限制外,另外还有一种比较特殊的是时间限制,那就是可以调一个within方法,它传入的呢是一个时间参数,它指的是当前我们指定的这个组合模式里边,模式序列里边,从第一个事件到最后一个事件,他们匹配上整个的这个时间间隔最大是多少?
08:14
只有在这个时间间隔内匹配上的事件,才是我们完整的匹配上的复杂事件,如果超出了这个时间段的话,那就会超时退出。这就是我们所说的,在CP的模式定义当中,各种不同的组合条件构建成的一个组合模式啊,那所以这里边就有严格的进行条件next。宽松的定邻条件是followed by,那非确定性宽松定邻条件是followed by any,另外呢,还可以定义否定性的不能严格径邻,那是not next,不能宽松径邻,那就是not follow by。另外还可以指定时间条件限制V。除了这些之外呢,最后我们再来介绍一下循环模式里边的经营条件。
09:01
前面我们介绍的都是模式序列里边,不同的个体模式之间,他们发生的事件到底是什么样的一个竞邻关系,那我们就想到了,在一个个体模式里边,如果它是循环模式的话,也会检测到多个事件,这多个事件之间他们的竞邻关系又是什么样的呢?啊,其实我们之前已经说到了啊,在循环模式里边,假如说后边我们直接跟了一个TIME3的话,默认检测到的这三个事件之间,他们其实是类似于followed by这样的一个宽松径邻关系啊,所以就是说他们只是跟在后边就可以,中间可以插入别的事件。那这样的话,我们就会发现其实非常的不方便啊,因为对于这样一个需求,我们自然想到了,如果说我们要检测的这个事件,它的类型都一样的话,都是登录失败的话,那很显然我们直接使用一个循环模式就会非常的方便,我们现在是连续三次登录失败,那假如要是连续十次呢,连续100次呢?啊,那难道我们后面一直next next不停往后追加吗?这个显然就不如后面直接跟一个点times来的方便。
10:10
所以我们就考虑了那点,Times默认是一个宽松净灵模式,能不能把它改成严格净灵呢?哎,其实是可以的,只要后边我们再追加一个额外的方法,哎,那就是consecutive consecutive我们知道有连续的意思,哎,所以如果说我们在一个循环模式后边,就是我们指定了啊VR条件,然后后面跟一个TIMES3表示循环三次,后面如果再跟上一个conservative的话。这就表示我们的连续三次登陆失败事件,那必须是要紧挨在一起的,相当于指定了一个next严格进行条件。所以这里边这个con这样的一个后缀啊,它一般都是要跟循环量词times one or more配合使用的。那这里是把一个本来是宽松径邻的关系改成了严格近邻,那默认的这个宽松径邻关系能不能改成非确定性宽松径邻呢?也是可以的,如果我们要改的话,就在后面加上一个allow combinations这样一个方法,调用之后实现的效果就跟followed by any相同了。
11:17
这就是关于组合模式的各种用法。
我来说两句