00:00
首先我们来说一说个体模式的量词啊,那所谓的量词呢,其实就是我们前面说的,在pattern这个类里边可以调用一些特殊的方法,这些方法呢,就可以指明当前我们这个个体模式要去循环检测的次数,哎,这就是我们所说的量词,它代表我们当前一个个体模式不仅仅只能匹配接收一个事件,那还有可能呢,匹配多个相同类型的事件啊,那所以从这个角度我们可以分一下类,那就是说假如说我们只接收匹配到一个事件的话,这种个体模式我们就叫做单例模式。啊,只有一个实例,那如果说我们循环的检测,检测多个事件的话,那么我们就把它叫做循环模式,哎,所以默认情况下啊,如果像我们之前这段代码里边并不去指明量词的话,那么当前这就是一个单例模式,只接收一个事件,那如果要是说后边我跟上的量词,比方说加了一个times,那么就表示当前是一个循环模式,它可以接收多个事件。
01:10
啊,那我们其实也看到了,在这个pattern里边有各种各样不同的方法,有些呢,可能是我们说的那个连接词,有些是这里所说的个体模式的量词,那到底有哪些是量词呢?我们这里可以归下类啊,主要有这几种量词,一个就是one or more,我们看到。那加上了one more就表示当前我们这个个体模式匹配的事件可以出现一次或多次。那假如说A是一个个体模式的话,A后边掉一个one or more方法,那么就表示可以匹配一个或者多个A对应匹配到的事件的组合,哎,所以有时候就会用这个A加来简单表示这样的一个模式啊,那其实我们看到这种方式呢,就跟正则里边匹配字符的那种表达是非常类似的啊啊,事实上在弗Li cp的底层实现原理里边,它就是一个有限状态机,其实就跟正则底层的实现是一样的。
02:12
那关于状态机这一部分呢,我们到这章的最后可以再做一个扩展啊,现在呢,我们主要是考察CP里边pattern的定义,那接下来除了one之外呢,接下来还有times,这个是非常经典的一个量词了,那顾名思义,Times里边可以传入一个整数类型的参数,它就表示我们当前的这一个模式要循环这么多次啊,那比方说来一个TIMES3的话,那就表示。A对应的这一个模式要连续匹配三次,这才叫做真正意义上的匹配。所以它主要匹配的事件是什么呢?就是AAA连续三个A。那同样times呢,还可以传两个参数,如果是两个参数的话,那就相当于是从多少次到多少次的一个循环范围,哎,那所以如果是a.TIMES2,四的话,那就表示A重复出现二到四次,它可以匹配AAAAA以及aaaa这几种都可以匹配到。
03:17
除了前面我们比较好理解的这几种之外呢,另外还有两个比较特殊的量词的用法,一个是greedy,啊,那其实我们知道这个greedy它是贪心贪婪的这个意思啊,啊,这种模式呢,它只能是用在一个循环模式的后边,加一个gray进行一个补充说明,这是什么意思呢?啊,那就是让当前的循环模式要变得更加的贪心,也就是说如果说当前的循环模式可以匹配的数量可多可少的话。那么我们现在加了G,就尽可能的去多的匹配啊,比如说a.TIMES24,哎,我们说它是可以匹配两个三个四个都可以,那假如说啊,我们现在出现了一个AAA连续四个A这样的一组事件的话,那很显然啊,那就是任意的两个A也可以匹配在一起啊,因为它是只要是满足连续的两个A就可以嘛,所以中间这两个AA也可以,后面两个A也可以,那任意的三个连续的A也是可以的,当然连续四个A也是一组匹配。
04:23
那假如说我们加上ged之后呢?哎,那就所有的那些两个三个的A都不再匹配了,我只要最大次数的匹配,那就只匹配四个A。这就是所谓的greedy啊,贪婪,所以我们会发现啊,只要使用了greedy之后,就相当于会把我们之前在某个范围内进行循环匹配的这种模式啊,呃,那它的筛选出来的匹配视线就会大大的减少,就会集中在长度最长的那个匹配项上。那另外还有一个呢,叫做optional啊,那同样optional呢,也是要用在某种循环模式的后边,加一个补充说明啊,那顾名思义它就是可选,意思就是当前的这个模式呢。
05:08
是一个可选项,可以有也可以没有啊,所以接下来我们看到啊,这些所有的量子组合起来,就可能有以下的这些情况,我们可以举一个例子啊,比方说patternon本身是我们定义出来的一个个体模式,接下来如果说直接patternon.times4的话,哎,那就是对应的这个匹配事件循环出现四次。那如果是TIMES4后边再加一个optional呢,哎,那就表示当前匹配的这个事件,要匹配的话,诶,那就是直接出现四次,或者呢,直接不匹配也是可以,哎,那我们可能会想到那不匹配也是可以的,这有什么意义呢?啊,那因为后边我们说不同的个体模式还要再组合起来嘛,前后还要发生,但所以这里每一步啊,你有可能是连续的几个,也有可能呢,哎,就是没有也行,这当然就有意义了啊,就在我们这个前后发生的复杂事件里边,每一步他可选,这就有意义了。
06:08
那除了这些之外,还有就是TIMES24,那我们说了,这就是出现234次,那如果是二四,然后后边加ged的话,那我们说这是要尽可能的多匹配,也就是说如果连续的出现了四次的话,那就以四个为准啊,如果是连续出现三次的话,那就以三个为准啊。然后如果是TIMES2次,然后后面加一个optional的话,那它的意思就是说可以匹配出现两次,三次或者四次,或者呢,或者零次就不出现也是可以的。那另外我们看到还可以所有的都叠加在一起啊,哎,那就是TIMES24,然后加上optional,然后再加上greedy,这表示的含义就是。默认情况下,我们应该要匹配这个事件,循环出现两次三次或者四次或者零次啊,就是不出现也行,那如果要出现的话啊,那尽可能的多匹配。
07:03
也就是说如果他不出现,那也就罢了,这也算是一个正常的匹配项啊,那如果说他要是出现的话,那就尽可能的匹配多的情况,少的那个就忽略不计。那另外还可以one more one more呢,就是一次或多次了,同样one or more后边也可以加greedy,也可以加option,这表示的就是尽可能的多匹配,或者是直接不出现也行啊,那另外这两个同样也可以结合在一起去用。除此之外呢,另外还有一个就是times or more,那前面我们看到就是主要的这个量词啊,就是一个是times,一个是one more,另外还有一个是times,顾名思义,这就是。至少出现两次,也有可能比两次还多,哎,那就是两次或多次啊,那同样后面也可以跟greedy optional以及两者都有,这就是所有量词的组合用法。这里我们还需要去解释的一个问题,就是那之前我们说啊,默认这里边我们认为个体模式其实是单例吧,检测到的就只有一个事件啊,那自然我们就可以知道啊对应的一个名称,那检测到的就是一个事件,那假如说现在我们变成了一个循环模式,后边这里加了一个times。
08:20
哎,那假如说加了一个times的话,这样检测到的同一个名称下边这个first few下边这就不是只有一个few了呀,不就变成三个few了吗?那对应的这三个事件又怎么样去做提取呢?如果我们仔细回忆一下的话,就会想起来啊,之前我们提取的时候,它对应的这个map里边的操作,这不是一个K,一个value key是当前我们给定的这个名称,Value不是一个list吗?诶,之前我们说这个例子里边只有一个元素,那是因为它是单例模式,那如果说现在我们是循环模式里边匹配检测到了多个事件的话,那当然就可以从这个list子的列表里边依次把它拿出来了。哎,所以我们看为什么它底层要设计成这个只保存的是list子的类型呢?就是因为存在着循环模式匹配到了多个实现。
09:14
这里还需要解释的一个就是,诶要这么看的话,那这个循环模式非常好用啊,你像之前我们说这个连续三次登录失败,那我们还非常麻烦的设置了一个begin,然后第一次登录失败,然后后面又next next,那我们现在看,那根本不用后面这两个next吗?直接第一个feel之后我们直接来一个TIMES3,让它匹配循环三次不就完了吗?直观上看的话,这种方式确实很好啊,但是直接这么做得到的结果是不对的,因为啊,这里边我们还得考虑一下,他们之间的这个连接关系到底是什么样的,对吧?呃,这就是我们说的max,它指的是什么呢?它指的是紧跟着,就是前一个事件后面必须紧跟着下一个失败的事件。
10:00
那我们说中间如果跟着一个成功的事件的话,那就相当于不匹配我们这个复杂事件了,啊,这个模式相当于就断开了。那这里边如果是times循环出现,它默认的这种关系是什么呢?默认的关系是宽松的,不是严格意义上的紧跟着的啊,也就是说你即使是啊,第一个feel了,后面呢,来了一个success,然后后面再来feel,它同样能匹配的上。所以我们就不能直接用这个times啊啊,这里我们暂时能够使用的方式还是点next.next这种方式,这就是关于个体模式里边量词的用法。
我来说两句