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中不会导致此问题。 […]

使用平衡组的正则表达式

我有一个基本的文本模板引擎,使用这样的语法: foo bar %IF MY_VAR some text %IF OTHER_VAR some other text %ENDIF %ENDIF bar foo 我有一个正则表达式的问题,我用来解析它,因为它没有考虑嵌套的IF / ENDIF块。 我正在使用的当前正则表达式是: %IF (?[\w_]+)(?.*?)%ENDIF 我一直在阅读平衡捕获组(.NET的正则表达式库的一个特性),因为我理解这是支持.NET中“递归”正则表达式的推荐方法。 我一直在玩平衡组,到目前为止已经提出了以下建议: ( ( (?’Open’%IF\s(?[\w_]+)) (?.*?) )+ ( (?’Close-Open’%ENDIF)(?.*?) )+ )* (?(Open)(?!)) 但这并不完全符合我的预期。 例如,它捕获了很多空组。 救命?