了解量词
我正在学习关于量词的Java教程。
贪婪、不情愿和所有格量词之间的差异之间有一个区别。
我无法理解到底有什么区别。
说明如下:
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.
第一个示例使用贪婪量词 .* 查找“任何东西”,零次或多次,后跟字母“f” “o” “o”。由于量词是贪婪的,因此表达式的 .* 部分首先吃掉整个输入字符串。此时,整体表达式无法成功,因为最后三个字母(“f”“o”“o”“o”)已被使用。因此,匹配器一次缓慢地后退一个字母,直到最右边出现的“foo”被反刍,此时匹配成功并且搜索结束。
然而,第二个例子是不情愿的,所以它首先消耗“无”。由于“foo”不会出现在字符串的开头,因此它被迫吞下第一个字母(“x”),这会在0和4处触发第一个匹配。我们的测试工具继续该过程,直到输入字符串耗尽。它在4和13找到另一个匹配项。
第三个示例未能找到匹配项,因为量词是所有格的。在这种情况下,整个输入字符串由 .*+ 使用,不会留下任何内容来满足表达式末尾的“foo”。使用所有格量词来表示你想抓住所有东西而不退缩的情况;在没有立即找到匹配项的情况下,它将优于等效的贪婪量词。