我找到了这个关于正则表达式的教程,虽然我直观地理解了“贪婪”、“不情愿”和“占有”限定词的作用,但我的理解似乎有一个严重的漏洞。
具体来说,在以下示例中:
Enter your regex: .*foo // Greedy qualifier
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 qualifier
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 qualifier
Enter input string to search: xfooxxxxxxfoo
No match found.
解释提到吃掉整个输入字符串,字母被消耗,匹配器后退,“foo”最右边的出现被反刍,等等。
不幸的是,尽管有很好的比喻,但我仍然不明白什么被谁吃掉了……你知道另一个教程(简明地)解释了正则表达式引擎的工作原理吗?
或者,如果有人可以用不同的措辞解释下一段,那将不胜感激:
第一个示例使用贪婪量词
.*
来查找“任何东西”,零次或多次,后跟字母"f"
,"o"
,"o"
。因为量词是贪婪的,.*
所以表达式的一部分首先吃掉整个输入字符串。此时,整体表达式无法成功,因为最后三个字母("f"
,"o"
,"o"
)已经被 [by who?] 消耗掉了。因此,匹配器慢慢地后退 [从右到左?] 一次一个字母,直到最右边出现的"foo"
被反刍 [这是什么意思?],此时匹配成功并且搜索结束。然而,第二个例子是不情愿的,所以它首先消耗[由谁?]“无”。因为
"foo"
没有出现在字符串的开头,所以它被迫吞下[谁吞下?]第一个字母(an"x"
),这会在 0 和 4 处触发第一次匹配。我们的测试工具继续这个过程,直到输入字符串用完. 它在 4 点和 13 点找到另一个匹配项。第三个示例找不到匹配项,因为量词是所有格。在这种情况下,整个输入字符串被
.*+
[how?] 使用,没有留下任何东西来满足表达式末尾的“foo”。使用所有格量词表示你想抓住所有东西而不退缩[退缩是什么意思?];在没有立即找到匹配的情况下,它将优于等效的贪婪量词。