greedy、reluctant和possessive量词的区别
greedy、reluctant和possessive量词之间有微妙的区别。
greedy量词被看作“贪婪的”,因为它们在试图搜索第一个匹配之前读完(或者说吃掉)整个输入字符串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在输入字符串中后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1个或者0个字符。
但是,reluctant量词采取相反的方式:它们从输入字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。
最后,possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和greedy量词不同,possessive从不后退,即使这样做能允许整体匹配成功。
为了演示,我们分析输入字符串xfooxxxxxxfoo:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
第一个例子使用greedy量词.*搜索“任何内容”零次或者多次,后面是字母f、o、o。因为是greedy量词,所以表达式的.*部分首先读完整个字符串。这样,整个表达式不会成功,因为最后三个字母(“f”“o”“o”)已经被消耗了。所以匹配器缓慢地一次后退一个字母,一直后退到最右侧出现“foo”为止,这里匹配成功并且搜索停止。
但是第二个例子使用的量词是reluctant量词,所以它首先消耗“无内容”。因为“foo”没有出现在字符串的开头,所以迫使它消耗掉第一个字母(x),这样就在索引0和4的位置触发第一个匹配。我们的测试示例继续处理,直到输入字符串耗尽为止。它在索引4和13找到了另一个匹配。
第三个例子找不到匹配,因为是possessive量词。这种情况下,.*+消耗整个输入字符串,在表达式的结尾没有剩下满足“foo”的内容。possessive量词用于处理所有内容,但是从不后退的情况;在没有立即发现匹配的情况下,它的性能优于功能相同的greedy量词。
分享到:
相关推荐
greedy_c源程序greedy_c源程序greedy_c源程序
贪吃蛇小游戏,闲的无聊可以下来玩玩,哈哈。由于java编写,所以需要 jre 环境噢,电脑装了java的都有此环境。纯手打,java开发,学习开发全流程见 ...
windows 32位汇编语言编写的贪吃蛇项目,双击目录下的Debug下的Greedy snake.exe即可运行。可以使用visial studio打开项目。大概用了600行代码。
greedy-snake 贪吃蛇小游戏
算法课的课件,详细的介绍了greedy algorithm的思想,通俗易懂的例子,英文课件
greedy algorithm is a source data
et al recently introduced a greedy layer wise unsupervised learning algorithm for Deep Belief Networks DBN a generative model with many layers of hidden causal variables In the context of the above ...
a snake that is so greedy,and if it can,it will eat itself
3个关于greedy算法的经典实例,不过是英文的,老外讲的挺细的
We present Greedy Perimeter Stateless Routing (GPSR), a novel routing protocol for wireless datagram networks that uses the po- sitions of routers and a packet's destination to make packet for- ...
Dynamic analysis of multiagent Q-learning with ε-greedy exploration
GREEDY FUNCTION APPROXIMATION- A GRADING BOOSTING MACHINE.pdf
Greedy Layer-Wise Training of Deep Networks
关于数据记录中的贪心算法
A Fast Greedy Algorithm for Outlier Mining,何增友,,The task of outlier detection is to find small groups of data objects that are exceptional when compared with rest large amount of data....
计算机贪心算法,介绍了贪心算法的基本概念,全英文版 DR. ranka
C语言编写,环境Visual Studio 2019。运行之后按wsad来控制方向。本代码功能一个简易界面加一条贪吃蛇,其余功能可以自行加入。
共有四个类:Food用于设置食物的随机产生、Snake用于实现蛇头蛇身的初始化以及对蛇是否吃到食物、是否撞到墙和是否撞到自己的判断、SnakePanel用于绘制图形界面、SnakeFrame为总体框架,可在其中添加监听或面板等,...
简单的贪吃蛇小游戏,适合Java开发初学者用来学习,其中用到了IO流操作,线程Thread处理,Frame的使用等