正则表贪心懒惰与占有
贪心
我们知道我们的量词是贪心的。
我写下来: /d{1,5}
那么它匹配了5个。
那么量词的匹配规则是啥呢?
量词首先匹配整个字符串,如果失败然后回退一个字符,然后再次进行匹配。这就是回溯。
它会每次回退一个字符,然后找到为止。然后呢,它还有记录所以行为,想想是不是消耗有点大。
没错这一章,就是用来提高效率的,对爬虫挺关键的一个东西。
那么什么是惰性的呢?
它是从目标为位置开始匹配,每次检查字符串的一个字符,然后还是会尝试匹配整个字符。
也就是说,贪心先把整个给匹配,然后惰性一个一个来,那么它会遇到不匹配的,这时候就结束。但是依然会去匹配整个字符一次。
最后一个是占有。
占有两次会覆盖整个目标,然后尝试匹配内容,但是至少尝试一次。
这个听起来不明白哈,我下面有个例子就很明白的了。
正文
我们先来看几个简单的字符:
语法 | 描述 |
---|---|
? | 零个或者一个 |
+ | 一个或者多个 |
* | 零个或者多个 |
我们看下有什么方法可以替代他们:
? 我们可以用 {0,1}
- 可以用 {1,}
- 可以用{0,}
贪心
这个不必多讲。
比如说有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次 |