using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var s = @"_if_111_else_222_if__if_333_else_444_endif__else_555_if_666_else_777_endif__endif__endif_";
var pat = @"(?x)(?= # Start of the overlapping match capturing lookahead
(_if_ # Leading delimiter
(?> # Start of atomic group (no backtracking into it)
(?!_(?:end)?if_). # Any symbol not starting the delimiter sequence
|(?<o>_if_) # A leading delimiter added to stack o
|(?<-o>_endif_) # Trailing delimiter added to stack o
)* # Repeat the atomic group 0+ times
(?(o)(?!)) # If the o stack is not empty, fail the match
_endif_ # Trailing delimiter
)
)";
var res = Regex.Matches(s, pat)
.Cast<Match>()
.Select(p => p.Groups[1].Value)
.Where(n => n.Contains("_else_"))
.ToList();
foreach (var v in res)
Console.WriteLine(v);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLklPOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciBzID0gQCJfaWZfMTExX2Vsc2VfMjIyX2lmX19pZl8zMzNfZWxzZV80NDRfZW5kaWZfX2Vsc2VfNTU1X2lmXzY2Nl9lbHNlXzc3N19lbmRpZl9fZW5kaWZfX2VuZGlmXyI7CgkJdmFyIHBhdCA9IEAiKD94KSg/PSAgICAgICAgIyBTdGFydCBvZiB0aGUgb3ZlcmxhcHBpbmcgbWF0Y2ggY2FwdHVyaW5nIGxvb2thaGVhZAoJCQkgKF9pZl8gICAgICAgICAgICAgICAgICMgTGVhZGluZyBkZWxpbWl0ZXIKCQkJICAoPz4gICAgICAgICAgICAgICAgICAjIFN0YXJ0IG9mIGF0b21pYyBncm91cCAobm8gYmFja3RyYWNraW5nIGludG8gaXQpCgkJCSAgICg/IV8oPzplbmQpP2lmXykuICAgIyBBbnkgc3ltYm9sIG5vdCBzdGFydGluZyB0aGUgZGVsaW1pdGVyIHNlcXVlbmNlIAoJCQkgICB8KD88bz5faWZfKSAgICAgICAgICMgQSBsZWFkaW5nIGRlbGltaXRlciBhZGRlZCB0byBzdGFjayBvCgkJCSAgIHwoPzwtbz5fZW5kaWZfKSAgICAgIyBUcmFpbGluZyBkZWxpbWl0ZXIgYWRkZWQgdG8gc3RhY2sgbwoJCQkgICkqICAgICAgICAgICAgICAgICAgICMgUmVwZWF0IHRoZSBhdG9taWMgZ3JvdXAgMCsgdGltZXMKCQkJICAoPyhvKSg/ISkpICAgICAgICAgICAjIElmIHRoZSBvIHN0YWNrIGlzIG5vdCBlbXB0eSwgZmFpbCB0aGUgbWF0Y2gKCQkJIF9lbmRpZl8gICAgICAgICAgICAgICAjIFRyYWlsaW5nIGRlbGltaXRlcgoJCQkgKQoJCQkpIjsKICAgIAl2YXIgcmVzID0gUmVnZXguTWF0Y2hlcyhzLCBwYXQpCiAgICAJCS5DYXN0PE1hdGNoPigpCiAgICAJCS5TZWxlY3QocCA9PiBwLkdyb3Vwc1sxXS5WYWx1ZSkKICAgIAkJLldoZXJlKG4gPT4gbi5Db250YWlucygiX2Vsc2VfIikpCiAgICAJCS5Ub0xpc3QoKTsKICAgICAgICBmb3JlYWNoICh2YXIgdiBpbiByZXMpCiAgICAgICAgCUNvbnNvbGUuV3JpdGVMaW5lKHYpOwoJfQp9