最佳答案
我在正则表达式中发现了这个教程,虽然我直观地理解了“贪婪”,“不情愿”;和“;possessive"我的理解似乎有一个严重的漏洞。
具体来说,在下面的例子中:
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"令人反胃的,等等。
不幸的是,尽管有这些美好的比喻,我还是不明白谁吃什么……你知道另一个教程解释(简洁)如何正则表达式引擎的工作吗?
或者,如果有人能用不同的措辞解释下一段,那将是非常感激的:
第一个例子使用贪心量词
.*
来查找“anything”0次或多次,后面跟着字母"f"
,"o"
,"o"
。因为量词是贪婪的,表达式的.*
部分首先吃掉整个输入字符串。此时,整个表达式不能成功,因为最后三个字母("f"
,"o"
,"o"
)已经被[谁?]消耗掉了。所以匹配器慢慢后退[从右到左?]一次一个字母,直到"foo"
最右边的位置被反刍[这是什么意思?]],此时匹配成功,搜索结束。然而,第二个例子是不情愿的,所以它首先从消费[by whom?]“nothing"。因为
"foo"
没有出现在字符串的开头,它被迫吞咽[谁吞咽?]第一个字母("x"
),它触发第一个匹配0和4。我们的测试工具将继续这个过程,直到耗尽输入字符串为止。它在4和13处找到另一个匹配项。第三个例子没有找到匹配,因为量词是所有格。在这种情况下,整个输入字符串被
.*+
[如何?],没有留下任何东西来满足“;在表达式的末尾。使用所有格量词表示你想要抓住某物的全部而不后退(back off是什么意思?);在没有立即找到匹配的情况下,它将优于等效贪婪量词。