Tag: 回溯

以贪婪的重复回溯平衡组可能会导致失衡?

作为这个问题的一般酿造的例子,我的意图是匹配一些数字,然后是相同数量的b ,再加上一个b 。 检查此代码段中展示的两种模式( 也在ideone.com上 ): var r1 = new Regex(@”(?xn) (? a)+ (? b)+ (?(A)(?!)) b “); var r2 = new Regex(@”(?xn) (? a)+ (? b)+? (?(A)(?!)) b “); Console.WriteLine(r1.Match(“aaabbb”)); // aaabbb Console.WriteLine(r2.Match(“aaabbb”)); // aabbb 请注意,两种模式的匹配存在差异。 r1 ,在平衡组构造上使用贪婪重复,匹配3 a和3 b ,这不是预期的。 r2 ,使用不情愿的重复,给我2 a和3 b ,这是按预期的。 我可以解释的唯一方法是,当(? b)+回溯匹配少一个b ,它会从B堆栈中弹出但不会推回从A堆栈中相应弹出的内容。 因此,即使现在由于回溯而少了一个b匹配, A堆栈仍然是空的。 这是我能解释r1如何匹配aaabbb的唯一方法。 注意使用不情愿的+? 在r2中不会导致此问题。 […]