贪婪,非贪婪和占有量词的区别

来源:互联网 发布:js获取当前页面大小 编辑:程序博客网 时间:2024/06/02 23:24

-- Start

我们在 量词 一节中介绍了什么量词以及贪婪与非贪婪量词之间的区别。事实上,通常正则表达式支持以下三种量词。

贪婪量词非贪婪量词占有量词匹配X?  X??X?+匹配X 0次或1次X*  X*?X*+匹配X 0次或无数次X+  X+?X++匹配X 1次或无数次X{n}  X{n}?X{n}+匹配X n次X{n,}  X{n,}?X{n,}+匹配X 至少n次X{n,m}  X{n,m}?X{n,m}+匹配X 至少n次至多m次

那它们之间有什么区别呢? 下面我们通过一个简单的例子来考察贪婪与非贪婪之间的区别。

#!/usr/bin/perlmy $testText = "abbbb"; # 测试文本# 测试贪婪量词if($testText =~ m/(ab*)/) {    print "ab* 匹配了 $1\n";}# 测试非贪婪量词if($testText =~ m/(ab*?)/) {    print "ab*? 匹配了 $1\n";}

结果如下:

ab* 匹配了 abbbbab*? 匹配了 a

看到它们之间的区别了吗?现在你应该知道了贪婪与非贪婪的真正含义了吧。


下面我们通过一个简单的例子来考察一下什么是占有量词。

#!/usr/bin/perlmy $testText = "<abbbb>"; # 测试文本# 测试贪婪量词if($testText =~ m/(<.*>)/) {print "<.*> 匹配了 $1\n";}# 测试非贪婪量词if($testText =~ m/(<.*?>)/) {print "<.*?> 匹配了 $1\n";}# 测试占有量词if($testText =~ m/(<.*+>)/) {print "<.*+> 匹配了 $1\n";} else {print "<.*+> 无法匹配 <abbbb>\n";}

结果如下:

<.*> 匹配了 <abbbb><.*?> 匹配了 <abbbb><.*+> 无法匹配 <abbbb>

要想理解什么是占有量词,我们必须深入正则表达式的匹配原理,我们先来了解一下 <.*> 是如何匹配 <abbbb>的。

1. 首先 < 匹配字符串中的 <

2. 接着 . *会匹配字符剩余的所有字符,也就是 abbbb>

3. 接着是 >,但是此时,字符串中的所有字符已经被.* 匹配了,为了使整个表达式匹配成功,.* 必须吐出一个字符,吐出之后,表达式会判断 > 能否匹配那个吐出的字符,如果不能,它会再吐出一个字符进行判断,我们把这一过程称为回溯。.* 和 .*+ 的唯一区别是,.* 会吐出字符而 .*+ 在任何时候都不会吐出字符,一旦吃的嘴里,想让它往出吐,门儿都没有,这就是占有的真正含义。

--更多参见:正则表达式精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-13
-- Written by ShangBo on 2012-05-12
-- End