我找到了这本关于正则表达式的出色教程,尽管我直观地理解“贪婪”,“勉强”和“可能”量词的作用,但我的理解似乎还存在严重的漏洞。
具体来说,在以下示例中:
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.
解释提到了吃掉整个输入字符串,字母被消耗,匹配器退回,最右端出现的“ foo”已被反省,等等。
不幸的是,尽管有很好的隐喻,但我仍然不知道被谁吃掉了什么...您知道另一本教程(准确地)解释了正则表达式引擎如何工作吗?
或者,如果有人可以用不同的措辞解释下一段,那将不胜感激:
第一个示例使用贪婪量词。*查找“任何”,零次或更多次,后跟字母“ f”,“ o”,“ o”。由于量词是贪婪的,因此表达式的。*部分首先会吃掉整个输入字符串。此时,整体表达式无法成功,因为最后三个字母(“ f”,“ o”,“ o”)已经被消耗(由谁来使用?)。因此,匹配器一次(从右到左?)缓慢退回一个字母,直到最右边的“ foo”出现反响(这是什么意思?),这时匹配成功并且搜索结束。
但是,第二个示例是不情愿的,因此它从首先消耗(由谁?)“什么都没有”开始。因为“ foo”没有出现在字符串的开头,所以它被迫吞下(谁吞了?)第一个字母(“ x”),从而触发0和4处的第一个匹配。我们的测试工具继续进行此过程直到输入字符串用尽。它在4和13找到另一个匹配项。
第三个示例找不到匹配项,因为量词是所有格。在这种情况下,整个输入字符串将由。* +(如何使用)消耗掉,而在表达式末尾不留任何内容来满足“ foo”。对于希望在不退缩的情况下抓住所有东西的情况,请使用所有格量词(backful意味着什么?);如果没有立即找到匹配项,它将胜过等效的贪婪量词。
*
,+
和?
是贪婪的。 最小的量词喜欢*?
,+?
和??
是懒惰。 占有欲量词喜欢*+
,++
和?+
有粘性。