Java网络爬虫--正则表达式之详解贪婪、逐步、独吐量词

除过正则表达式的基本概念与特性还有使用方法之外,我们在解析html的时候,如果要进行字符串的匹配,必须还要熟悉正则表达式之中量词的使用法则,今天我们就来谈谈贪婪、逐步、独吐这三种量词的使用。


贪婪量词

我们先来看一下经常使用的贪婪量词都有哪些:

  • X?: X项目(项目也可以理解为X代表的变量,项目比较准确)出现一次或没有。
  • X*: X项目出现0次或多次。
  • X+: X项目至少出现1次。
  • X{n}: X项目出现n次。
  • X{n, }: X项目至少出现n次。
    X{n, m}: X项目出现n次但不超过m次。

下来我们解释贪婪量词为何贪婪。当我们使用贪婪量词进行字符串匹配的时候,如果比较器(Matcher)看到贪婪量词,会将剩下的字符串全部吃掉,然后从字符串的末尾一个个再吐出来,在这个过程中,它还会将吐出来的字符与规则表达式进行比较,如果吐出来的字符串符合规则表达式,而吃下的字符串也符合贪婪量词那么就比较成功,我们可以预想到,贪婪量词之所以贪婪,就是因为它会尽可能的找出长度最长的符合文字。

举个例子:
文字:xfooxxxxxxfoo,使用规则表达式 “.*foo“比较,当碰见贪婪量词 ” ” (*da不出来~~),比较器会吃掉剩下的字符串,在这个例子中也就是整个字符串,然后比较器再从后向前一个个将字符吐出来,当吐出foo的时候,foo符合贪婪量词之后的规则表达式,而剩下没吐的字符串也符合贪婪量词的部分,所以就匹配到了整个字符串,所以它尽可能的找出长度最长的符合文字。(“.”代表任一字符)


逐步量词

逐步量词也称非贪婪量词或懒惰量词,顾名思义,它和贪婪量词是相对的,它的形式是在贪婪量词之后加上“?”,形如:“.*?”,在使用逐步量词时,比较器会一边吃掉剩余文字,一边看吃下的文字是否符规则表达式,结果就是逐步量词会找出长度最短的符合文字。

还是上面的例子:
文字:xfooxxxxxxfoo,使用规则表达式 “.×?foo”比较,当碰见逐步量词 “ .×?” (*da不出来~~),比较器会边吃文字边比较而不会一下将剩余的文字全部吃掉,所以第一个匹配到的字符串就是“xfoo”,第二个匹配到的字符串就是“xxxxxxfoo”,所以它尽可能的找出长度最短的符合文字。


独吐量词

在贪婪量词之后加上“+”,形如:“.*+”就是一种独吐量词,在使用独吐量词的时候,如果比较器看到独吐量词,它会将剩下的字符串全部吃掉,然后和贪婪量词相反,它不会吐出文字和剩下的规则表达式比较,而是会将吃下的文字和独吐量词进行比较,如果吃下的字符串符合独吐量词,那么它将不会将吃下的字符串吐出。

依然是上面的例子:
文字:xfooxxxxxxfoo,使用规则表达式 “.*+foo”比较,当碰见独吐量词 “ .×+” (*da不出来~~),比较器会吃掉剩下的字符串,在这个例子中也是整个字符串,然后它发现吃下的整个字符串已经满足独吐量词“.×+”,所以它就不会将字符串再吐出,然后会因为没有剩余的字符串符合剩下的规则表达式“foo”而产生没有找到相匹配的字符串的情况,最后的结果就是没有任何文字符合。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值