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 Snake.zip”项目是一个生动的实例,展示了汇编语言在实现复杂游戏逻辑时的灵活性和效率。通过学习和分析这个项目,我们可以深入了解汇编语言的编程技巧,以及在实际项目中的应用策略。无论是对于汇编语言...
本项目"GreedySnake.zip"提供了这样一个简单的Java实现,旨在帮助初学者熟悉Java开发的基本技术和流程。以下是该项目涉及的主要知识点: 1. **Java基础知识**:在Java中编写贪吃蛇游戏,需要对基本语法、类与对象、...
贪吃蛇小游戏,闲的无聊可以下来玩玩,哈哈。由于java编写,所以需要 jre 环境噢,电脑装了java的都有此环境。纯手打,java开发,学习开发全流程见 ...
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 \) 和 \( b \) 后,访问文件 \( a \) 的成本增加了 \( L[b] \),而访问文件 \( b \) 的成本减少了 \( L[a] \)。整体来看,这样的交换改变了预期成本。接下来,我们可以通过数学归纳法来证明此引理,即...
根据提供的文件信息,本文将对“greedy_c源程序”中的关键知识点进行详细的解析与说明。此程序主要涉及了贪心算法(Greedy Algorithm)在C++中的实现,并结合具体的代码示例进行了演示。 ### 一、贪心算法概述 ...
对于一个毕业课程设计项目,"Greedy Arithmetic" 可能是将贪心算法应用于解决数学问题,比如求解最大子序列和、最小生成树等问题。在这样的设计中,学生需要理解贪心策略如何指导算法决策,并通过C语言编写代码来...
在`greedy-snake-master`文件夹中,代码可能被组织成不同的模块,如游戏逻辑模块、渲染模块、用户输入模块等,便于代码管理和维护。 10. **调试与优化** 使用console.log、浏览器的开发者工具等进行游戏逻辑的...
【C++]Greedy Snake 是一个基于C++编程语言和EasyX图形库实现的贪吃蛇游戏。这个项目展示了如何利用编程技术将简单的二维数组映射为游戏画面,并通过队列数据结构来管理蛇的移动与生长。以下是这个游戏实现中的关键...
贪食蛇(Greedy Snake)是一款经典且深受玩家喜爱的游戏,其核心玩法简单而有趣:控制一条不断移动的蛇,通过吃食物来增长,但要注意不能让蛇头碰到自己的身体或游戏边界,否则游戏结束。这个游戏在不同平台上都有...
总结来说,"4.11 GREEDYSNAKE.zip"项目展示了如何利用STM32的硬件优势和链表数据结构实现一个简单但有趣的游戏平台。这个项目对于学习嵌入式系统开发、C语言编程、链表算法以及STM32应用的人来说,是一个很好的实践...
### GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE #### 1. 引言与背景 本文探讨了一种新的函数逼近方法——贪心函数逼近法(Greedy Function Approximation, GFA),该方法特别关注梯度提升机...
在这个项目中,我们将深入探讨一个使用JavaScript、HTML和CSS实现的可视化贪吃蛇游戏——"Greedy-Snake-master.zip"。这个项目非常适合JavaScript初学者,它提供了丰富的注释和清晰的逻辑,有助于理解编程概念。 1....
由于文件内容不是有效的中文表述,此处提供的内容是基于理解和假设文档应该涵盖的主题和知识点,实际文档可能包含了更多具体的例子、详细的解释、算法的伪代码和图示等。在计算机贪心算法的课堂讲义中,除了理论讲解...
- 在实际应用中,通过合适的存储结构和算法优化,可以使得基于Datalog的贪心算法在经典搜索和优化问题中的性能接近于传统过程化方法。 - 例如,在最短路径问题中,尽管传统的方法(如Dijkstra算法)已经非常高效,但...
Visual Studio 2019是一个强大的开发环境,支持多种语言,包括C语言,它提供了丰富的调试工具和代码编辑器,便于程序员编写、测试和调试代码。 【游戏逻辑】 1. **坐标系统**:游戏通常使用二维坐标系表示屏幕上的...
课件中提到的贪心算法技术、分数背包问题、任务调度和最小生成树等内容,是计算机科学和算法设计中的重要知识点。掌握贪心算法能够帮助我们高效地解决一系列优化问题,尤其是那些可以通过一系列最优决策局部来构建最...
前端大厂最新面试题-greedy.docx 今天,我们将探讨前端大厂最新面试题-greedy.docx 中的知识点。Greedy 算法是前端开发中常用的算法之一,它可以...我们需要掌握 Greedy 算法的思想和应用,才能更好地解决实际问题。
贪心法(The Greedy Method)是一种常用的算法思想,它在面对最优化问题时,通过在每一步选择当前看起来最优的决策,以期逐步构建全局最优解。这种策略的特点是不回溯,即一旦做出一个选择,就不再考虑其他可能性。...
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....