贪婪与勉强与占有限定词

我发现了这篇关于正则表达式的教程,虽然我直观地理解了;贪婪的&引用;不情愿;及;所有格;在预选赛中,我的理解似乎有一个严重的漏洞

具体而言,在以下示例中:

输入您的正则表达式:.*foo//Greedy限定符
输入要搜索的输入字符串:xfooxxxxxfoo
我找到了这篇文章;xfooxxxxxfoo“;从索引0开始,到索引13结束。
输入您的正则表达式:*?foo//
输入要搜索的输入字符串:xfooxxxxxfoo
我找到了这篇文章;xfoo"从索引0开始,到索引4结束。
我找到了这篇文章;xxxxxx foo“;从索引4开始,到索引13结束。
输入您的正则表达式:.*+foo//所有格限定符
输入要搜索的输入字符串:xfooxxxxxfoo
没有找到匹配项。

解释中提到吃整个输入字符串,字母被消耗,匹配者退后,最右边出现;”富”,;已经反胃等

不幸的是,尽管有很好的比喻,我仍然不明白谁吃了什么。。。你知道另一个教程(简明地)解释了正则表达式引擎是如何工作的吗

或者,如果有人能用不同的措辞解释以下段落,我们将不胜感激:

第一个示例使用贪婪的量词*来查找;“任何事”;,零次或多次,后跟字母“;f&quot,”;o&quot,”;o&quot。因为量词是贪婪的,所以表达式的*部分首先吃掉整个输入字符串。此时,整个表达式不可能成功,因为最后三个字母(“f”“o”“o”)已经被[谁?]消费掉了。因此,匹配器慢慢后退[从右到左?]一次一个字母,直到最右边出现”为止;"富",已被反流[这意味着什么?],此时匹配成功,搜索结束

然而,第二个例子是不情愿的,因此它首先消费[由谁?];什么都没有;。因为”;"富",不会出现在字符串的开头,它会强制吞下[谁吞下?]第一个字母(一个“x”),这将触发0和4处的第一个匹配。我们的测试工具将继续这个过程,直到输入字符串耗尽为止。它在4和13处找到另一个匹配项

第三个例子找不到匹配项,因为量词是所有格。在这种情况下,整个输入字符串被*+[how?]使用,没有留下任何剩余内容来满足;"富",;在表达式的末尾。使用所有格量词表示你想抓住所有东西而不后退的情况[后退是什么意思?];在没有立即找到匹配项的情况下,它将优于等价的贪婪量词

我要试一试

贪婪的量词首先尽可能匹配。因此,*匹配整个字符串。然后匹配器尝试匹配下面的f,但没有剩余字符。因此它“回溯”,使贪婪的量词少匹配一个字符(使字符串末尾的“o”不匹配)。这仍然与正则表达式中的f不匹配,因此它又返回了一步,使贪婪的量词再次匹配一个更少的字符(使字符串末尾的“oo”不匹配)。该仍然与正则表达式中的f不匹配,因此它又返回了一个步骤(使字符串末尾的“foo”不匹配)。现在,匹配器最终匹配正则表达式中的f,并且o和下一个o也被匹配。成功

不情愿的或“非贪婪”量词首先尽可能少地匹配。因此,*一开始不匹配任何内容,使整个字符串不匹配。然后匹配器尝试匹配下面的f,但字符串中不匹配的部分以“x”开头,因此不起作用。因此匹配器回溯,使非贪婪量词再匹配一个字符(现在它匹配“x”,留下“fooxxxxxxfoo”不匹配)。然后它尝试匹配成功的f,以及正则表达式中的o和下一个o。成功

在您的示例中,它然后使用字符串“xxxxxx foo”的剩余不匹配部分重新启动流程,并遵循相同的流程

所有格量词就像贪婪量词一样,但它不会后退。因此,它从匹配整个字符串开始,不留下任何不匹配的内容。那么它就没有什么东西可以与正则表达式中的f匹配了。由于所有格量词没有回溯,因此匹配失败

发表评论