我在stackoverflow上找到了这个正则表达式的教程,虽然我直观地理解了“贪婪”、“勉强”和“占有”限定符的作用,但我的理解似乎存在重大漏洞。
具体来说,在以下示例中:
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"
)已经被消耗掉了[由谁?]。因此,匹配器一次回退[从右到左?]一个字母,直到“foo”的最右出现位置被“反刍”[这是什么意思?],此时匹配成功并结束搜索。但是,第二个例子是慢性的,所以它首先吃掉[由谁?]“nothing”。因为
"foo"
不出现在字符串的开头,所以它被迫吞下第一个字母(一个"x"
),这触发了第一个匹配0和4。我们的测试工具继续该过程,直到输入字符串用尽。它在4和13处找到另一个匹配项。第三个例子无法找到匹配项,因为量词是占有性的。在这种情况下,整个输入字符串都被
.*+
[如何?]消耗掉,没有剩余的内容来满足表达式末尾的“foo”。对于想要全部占有某些内容而永不回退的情况,请使用占有性量词;在匹配未立即找到的情况下,它将比等效的贪婪量词性能更好。
*
、+
和?
的最大匹配量词是贪婪的。类似于*?
、+?
和??
的最小匹配量词是懒惰的。类似于*+
、++
和?+
的占有式匹配量词是固执的。 - tchrist