-- 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/perl my $testText = "abbbb"; # 测试文本 # 测试贪婪量词 if($testText =~ m/(ab*)/) { print "ab* 匹配了 $1\n"; } # 测试非贪婪量词 if($testText =~ m/(ab*?)/) { print "ab*? 匹配了 $1\n"; }
结果如下:ab* 匹配了 abbbb ab*? 匹配了 a
看到它们之间的区别了吗?现在你应该知道了贪婪与非贪婪的真正含义了吧。
下面我们通过一个简单的例子来考察一下什么是占有量词。
#!/usr/bin/perl my $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