00:00
那接下来我们就再来把里边的每一类pattern都拆开,给大家做一个具体的讲解,那首先我们来看一下这个个体模式individual patterns,哎,它里边又包含什么样的一些定义呢?这里边大家看啊,个体模式可以包含又分成两类,一类叫做单例模式,还有一类叫做循环模式,这里边所说的这个单利模式,它本身英文也叫single,但并不是我们所说的那个设计模式里边的单利模式啊,呃,这是当前这个CP里边给大家所谓的这个single single的这个模式,那所谓这个呃,单利模式指的是什么呢?他说的就是当前的这一个,呃,我们定义好的这一个模式,检测事件的时候,只接收一个事件的匹配,就只只接收最后匹配起来的时候啊,只检测一个事件收过来就可以了,那与之对应的循环模式呢,就是可以检测多个对吧,可以接收多个事件,哎,这里边具体的区别是。
01:00
什么呢?区别就在于量词啊,这个量词又是什么呢?诶,这就是我们说的可以在一个个体模式后边呢追加一个量词,这个量词就代表了它可以循环的次数,具体来看,大家看可以指定什么呢?啊,前面我们不是给大家讲那个一开始定义的时候是begin,然后后边给一个啊,比方说我们叫start对吧?呃,后边然后给一个where条件,然后到底怎么样去选取,呃,然后注意后边还可以再追加一个量词,这里边这个量词我们前面直接就用了一个替代啊叫叫这个start啊大家知道什么意思就可以,其实就是前面我们定义好的已经有那个连接词对吧,已经有它的那个名称,然后后边可以追加这个方法啊,这个量词有什么呢?有times啊,然后还有什么呢?有times or more one or more,另外还有optional和greedy这些其实从字面上就非常好理解,Times什么意思啊,就是对。
02:00
当前我定义要求去匹配的这个事件,要循环出现四次,对吧,就是循环出现四次,这才叫我这一句这一步啊,整个把它匹配上,这是一种方式,然后另外呢,还可以怎么样,呃,这个TIMES4,然后optional加一个optional什么意思呢?可选对吧?大家知道optional就是可选项嘛,呃,可选的一个参数,意思就是说,哎,你可以匹配四次,也可以也可以不匹配,对吧?这个是个可选的,也就是说要不不匹配要出现的话,就直接匹配四次,对吧?啊,所以是零次或四次,然后另外还有就是还可以定义这个一个匹配次数的区间,比方说我们传两个参数TIMES2次,这表示什么呢?匹配二到四次嘛,对吧,234这些次数都可以匹配上,那如果要是呃在这个之外的话,那就不能匹配了啊,另外还可以后边直接加一个greedy greedy是什么意思呢?Grey的含义是贪婪对吧?大家记得这个像这个贪心算法,大家学算法的时候可能见过这个词啊,Greedy啊,就是贪婪的,贪心的,所以它的含义是什么啊,就是我如果能匹配更多的次数啊,能做这个更多匹配的时候,我要尽量去匹配更多的对吧,尽多的尽量多的做这个重复匹配少的那个我就不管了,呃,这是这个加上gedy的这个含义,那另外还有这个one or more,这个很好理解,那就是呃,只只出现一次或多次,对吧,这个你不用不用后面传参数了啊,这这里边就是多次不限,就one or more,然后另外还有一个就是times or more啊,就是这里边就是指定一个次数,那就相当于是两次,如果这里边给二的话,那就是两次或多次,那另外还可以怎么样呢?Times or more2后面再跟optional,然后再跟greed,大家看都可以串起来用啊,啊这就表示是什么,你可以是两次或多次,而且还可以怎么样呢?还可以一次都不匹配,对吧?啊,就是零次也是可以的。
03:57
另外呢,就匹配上的话,我尽量多的重复匹配对吧?呃,你那个少匹配的那个我就不要去考虑了啊,所以这里边就是大家实际应用的时候,可以有很多灵活的应用方式啊,哎从这里从这里大家可以看到一个CP的特点就是什么呢?哎,你看这个什么one or more times or more,这种定义有点像什么呀,大家能能联想起来,是不是能联想起来我们之前接触过的正则表达式里面那种写法,哎,对吧,你像这个我们正则里边有一个这个家对吧?哎,有一个这个心对吧?哎,你像这些定义不就是类似于one or more,或者是这个times or more,类似于这样的一个特点吧,对吧?呃,就是,只不过这里面的定义可能会略微不太一样。
04:42
哎,所以说确实啊,对于cep的实现而言,底层跟正则原理是差不多的,它底层给我们实现了一个什么呢?所谓的NFA,哎,就是这个应该叫做非确定性有限状态机啊,啊就是它底层是给我们实现了一个状态机的机制,用来控制我们这里边的一些状态跳转的,对吧?你就当前的这个,诶到底是呃,到底匹配上了还是没有啊,这是有一个状态的控,控制状态的跳转来来做这个管理的啊,大家可以稍微的了解一下啊,这个就是你如果追到源码里面会发现CP底层,哎,他就会用到这个NFA这样一个包啊,这就是它的一个底层原理跟正则基本上是类似啊,这是关于这个量词,所以我们知道了,呃,可以在后边去定义这个量词,让它循环的接收多个对吧,哎,所以这里边给大家再回到我们当时讲的原呃代码里边,大家再来回顾一下啊,当时。
05:42
我们说这里接收到的是一个map类型,对吧?拿到这个数据是map类型,然后里边这是一个KY6,对嘛,我们说这个string,前面这个string,那就是你指定的当前一个,诶现在我们知道这个含义了,当前个体模式对应的那个名称对不对?每一个个体模式是不是都要定义一个名称啊,然后这里面有一个问题,为什么后边要有一个list类型呢?它的value为什么是一个list类型呢?对,因为可以定义一个接收一个事件,也可以定义接收多个事件对不对?我们这里边定义的是相当于是单例个体模式只有一个对吧?哎,那当然这里边就只有一个数了,那假如说我这里边后面定义了times的话,那是不是相当于可以定义多个事件啊,那你说多个事件你怎么接收,哎,这里边当然就是一个直接放到一个例子里边来就完事了,对吧,你要想把这里边的多个数据拿出来的话,你就去便利这个list就可以搞定了啊,所以这个其实大家可以非常直观的就可以跟。
06:42
更加深刻的理解,当时我们拿到了这个map,里面的数据结构是什么啊?然后接下来我们继续看个体模式,接下来还有什么定义呢?哎,那就是条件了,前面大家看到那个where尔威不就是指定这个条件吗?因为我们定义每一个模式的时候,是不是都得指定一个触发的条件,要不然你光给我定义一个这个名称是什么?呃,然后定义一个它出现多少次,我哪知道你要什么东西啊,对吧?所有的数据来了之后都是一样的,我我这里边并不知道你想要什么样的数据,想要什么样的呃,选取的那个规则,所以你得把规则告诉我,这里的规则最简单的就是where,对吧,最常见的就是where,类似于一个filter的一个判断的筛选条件啊,那大家可能想到,那假如说我有多个条件怎么办呢?呃,多个条件,一种方法就是V2里边大家知道最后返回的是一个布尔类型的值的函数嘛,对吧,传的是一个函数,那我可以可以做一个那个,呃,就是相当于逻辑的组合对吧?呃,我返回的时候做一个逻辑与逻辑或这个是没。
07:47
问题的另外还可以怎么样呢?啊,CP里边给大家提供了不同的这种连接方式,就是我可以定义诶不同的相当于更加复杂一点的这种条件,对吧?哎,可以比方说用这个or或者n until去指定一些复杂的条件,所以这里边还是可以分成几类的,最简单的条件,那就是我们熟悉的where对吧?啊,就是这个where就是相当于指定,直接指定我们的类似于一个filter,大家把这个where就理解成一个filter就可以了啊,因为你要提取复杂事件嘛,那里边每一个个体事件的选取,不就是按照一定的filter规则去把它筛出来吗?所以这里边就是一个返回一个布尔类型值的一个函数。
08:32
这是where,然后接下来如果说我们还想做组合的话,那怎么办呢?哎,就是可以直接点O,就表示什么,大家看到调用方式就是点where给一个条件,然后在点or给一个条件,就表示这两个条件是一个或的关系,对吧?就是两者只要发生满足一个条件,我就这一步操作啊当前这个个体模式就满足,就把它筛选出来匹配上,哎,那另外大家想到有货就有雨,那有没有点and呢?啊,没有and,但是呢,那怎么实现点and呢?呃,那就是直接where,后面直接再where对吧,直接where相连就是and,这就是我们说的这个条件的与和或的组合构成的,这个叫做叫做组合条件,那另外还有一种特殊的条件叫做终止条件,终止条件是什么意思呢?哎,就是表示假如说啊,我当前这个处理当前的这个数据的时候呢,我前面定义了,比方说这个。
09:32
呃,这个第一个啊,初始的时候start的时候要检测什么样的数据,然后呢?呃,后面紧跟着又要检测什么样的数据,而且呢,我还定义了量词,就后面出现的这个数据可以来一个或多个,大家想想如果要是一个或多个的话,我这个什么时候才能把它匹配,就是这个匹配什么时候才算一个完呢?你想一个或多个我是不是相当于后面一直得等他呀,前面的数据是不是,那大家想后面我要一直等前面的数据是不是一直都得缓存着,你必须得缓存下来,我才能知道你当前这个模式到底是不是匹配上了,对吧?哎,所以你如果是一个或多个的话,那我这个缓存的数据就永远都释放不了了,所以在这种场景下,往往就要求大家必须要指定一个终止条件,就是说我当前定义的这个模式啊,要选取的是一组事件,复杂事件嘛,这个事件呢,你不要无限的等下去,最终是有一个事件来了之后,这就是终止条件,对吧。
10:32
呃,就是发现这个事件来了,截止你不要再看别的了,到目前为止,我这个所有事件结束了,这当前就是一个我们说的合并起来的一个大的事件,对吧?一个一个大的数据啊,包装成一个map,然后你检测出来,后面做处理就好了,不要继续等下去了,诶,那当前的这个条件就叫做终止条件,就是n until until字面也很好理解,直到嘛,直到什么程度为止,对吧?哎,所以这里边其实就是用它来做这个状态的清理的,这里边要求就是说,如果大家用到了one or more,或者times or more啊,另外还有这个optional optional还可选对吧?啊就是如果用到了这些的话,建议大家一定要后面跟一个until清空状态,要不然他会不停的保持,对吧,你当然不跟也是合法的,但这个就是性能会受到很大的影响。
11:20
啊,那最后还有一个比较特殊的叫做迭代条件,迭代条件这个也比较复杂一点,这是什么呢?同样也还是一个where啊,Where这个里边就传的不是一个简单的filter选取了,而是怎么样呢?诶大家看这个简单做这个filter选取的时候,当前拿到的就是就是当前每一个数据,那个每一个事件,对吧?啊,就是当前那个处理的那个事件,就像filter一样啊,而现在呢,我除了当前的事件之外,还有一个上下文,还有一个ctx,那这个ctx可以获取到什么呢?大家看到它可以get events for pattern,也就是说我可以获取到之前某个,也就是我现在不是这个定义了不同的呃个体模式吗?之前有start,有middle,对吧,有有这个什么and啊,有各种各样的这个数据,我可以按照这个名字直接去获取到之前匹配好的对应的那个事件,所以这个就很强大对吧,我就相当于我可以有状态了啊,就可以拿到之前的一些状态了,不光。
12:20
方式基于当前这个数据去做处理了啊,当然这个就是还是看特殊的场景啊,一般用不到,一般我们直接定义那个事件,它的组合的这种这种方法就可以了啊,就在有一些特殊情况下,复杂的需求可能才会用到它,这就是关于这个个体模式的一些具体的给大家做一个一个展开。
我来说两句