正则表达贪心懒惰与占有

贪心

我们知道我们的量词是贪心的。

我写下来: /d{1,5}

那么它匹配了5个。

那么量词的匹配规则是啥呢?

量词首先匹配整个字符串,如果失败然后回退一个字符,然后再次进行匹配。这就是回溯。

它会每次回退一个字符,然后找到为止。然后呢,它还有记录所以行为,想想是不是消耗有点大。

没错这一章,就是用来提高效率的,对爬虫挺关键的一个东西。

那么什么是惰性的呢?

它是从目标为位置开始匹配,每次检查字符串的一个字符,然后还是会尝试匹配整个字符。

也就是说,贪心先把整个给匹配,然后惰性一个一个来,那么它会遇到不匹配的,这时候就结束。但是依然会去匹配整个字符一次。

最后一个是占有。

占有两次会覆盖整个目标,然后尝试匹配内容,但是至少尝试一次。

这个听起来不明白哈,我下面有个例子就很明白的了。

正文

我们先来看几个简单的字符:

语法 描述
? 零个或者一个
+ 一个或者多个
* 零个或者多个

我们看下有什么方法可以替代他们:

? 我们可以用 {0,1}

  • 可以用
  • 可以用

贪心

这个不必多讲。

比如说有5,然后我写一个5?,那么5就会被匹配。不是说好5?是可有可无吗?就是因为贪心,可有可无就是有。

惰性

还是上面这个例子,5?,然后我加一个?,也就是5??,我们的文本还是5。然后发现一个都不匹配了。这时候就是惰性了。
然后再匹配一个5*?,发现也一样没有匹配到啥东西。


然后5+?:

匹配了一个,果然只有是能符合的马上就结束了。

语法 描述
?? 惰性匹配0或1次
+? 惰性匹配1到多次
*? 惰性匹配0到多次
{n}? 惰性匹配n次
{n,}? 惰性匹配n到多次
{n,m}? 惰性匹配1到n次

这里有人会理解+?,就是一个哈。其实不是的。
来一个例子对比下:

惰性:

贪婪:

惰性是匹配完了就不匹配了,而贪婪是看看还有更多不。

5*? 与 5555不是说真的没有匹配到。而是:

这是因为后面没有条件,那么就躺尸了。改一下:

占用

这个非常像贪心,但是不会回溯,很好理解,下面给个例子哈。
0*0 去匹配00000:


是可以匹配的。
但是我换成0*+0,

告诉我没有匹配,为什么呢?

我们来看下贪心,0*把整个字符匹配了,也就是匹配5个,然后无法匹配0,失败。然后呢,回溯,退一个字符。匹配4个0。这下就匹配上了。

占用可就不一样了,比较自私0*把整个字符匹配了,也不回溯,但是要占用它,然后就永远匹配不是,结束,效率高哈。

语法 描述
?+ 占用匹配0或1次
++ 占用匹配1到多次
*+ 占用匹配0到多次
{n}+ 占用匹配n次
{n,}+ 占用匹配n到多次
{n,m}+ 占用匹配1到n次
posted @ 2020-04-25 10:55  敖毛毛  阅读(289)  评论(0编辑  收藏  举报