除过正则表达式的基本概念与特性还有使用方法之外,我们在解析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”而产生没有找到相匹配的字符串的情况,最后的结果就是没有任何文字符合。