我发现关于如何执行贪婪的正则表达式有两种不同的看法:
- 一种是,读取所有输入字符串并从后面匹配模式,首先匹配整个输入,第一次尝试是整个字符串。一些支持这种观点的文章是Oracle 官方 Java 教程:
贪婪量词被认为是“贪婪的”,因为它们强制匹配器在尝试第一次匹配之前读入或吃掉整个输入字符串。如果第一次匹配尝试(整个输入字符串)失败,匹配器将输入字符串回退一个字符并再次尝试,重复该过程直到找到匹配或没有更多字符可以回退。
另请参阅这篇文章:贪婪与惰性正则表达式量词的性能
- 另一个是从前面匹配,第一次匹配尝试是从左边的 0 索引开始。当找到匹配时,引擎不会停止,继续匹配其余的,直到它失败然后它会回溯。文章支持我发现的这个观点是:
与 Star 和 Plus的 重复Looking Inside The Regex Engine
部分讨论<.+>
:
正则表达式中的第一个标记是 <。这是字面意思。正如我们已经知道的,它将匹配的第一个位置是字符串中的第一个 <。
我想知道哪个是正确的?这很重要,因为它会影响正则表达式的效率。我添加了各种语言标签,因为我想知道每种语言的实现方式是否不同。