博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贪婪,非贪婪和占有量词的区别
阅读量:4049 次
发布时间:2019-05-25

本文共 1291 字,大约阅读时间需要 4 分钟。

-- 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 = "
"; # 测试文本# 测试贪婪量词if($testText =~ m/(<.*>)/) { print "<.*> 匹配了 $1\n";}# 测试非贪婪量词if($testText =~ m/(<.*?>)/) { print "<.*?> 匹配了 $1\n";}# 测试占有量词if($testText =~ m/(<.*+>)/) { print "<.*+> 匹配了 $1\n";} else { print "<.*+> 无法匹配
\n";}
结果如下:

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

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

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

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

--更多参见:
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-13
-- Written by ShangBo on 2012-05-12
-- End
你可能感兴趣的文章
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>