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

-- 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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值