Pankon, я долго смотрел на Ваш пример, и, если правильно понял, то задача состоит в том, чтобы из размеченной строки последовательно извлечь нулевые (без тегов) и первые (заключённого в одну пару <lif>ов) по вложенности тексты. Правильно? Если так, то здесь имеет место быть задача о вложенных скобках. В отличие от классических автоматов, на регекспах эта задача решается, поскольку последние дополнительно вооружены групп-рекурсиями :
| Код | string target = "test000(test001)test002(test003((test004)test005))test006";
Regex block = new Regex( @"\((?>[^()]+|\((?<GROUP>)|\)(?<-GROUP>))*(?(GROUP)(!?))\)");
MatchCollection matches = block.Matches(target);
foreach (Match match in matches) Console.WriteLine(match.Groups[0]);
Console.WriteLine("Done."); Console.ReadKey();
|
Результат :
| Цитата | (test001) (test003((test004)test005)) Done.
|
Часть требуемого результата получена. Но выглядит сурово, правда? Если нет такой необходимости возиться с регекспами, то проще воспользоваться парсером (регекспы - это больше лексеры). То есть, например, инициализировать нулём целочисленную переменную - индикатор и пройти по строке. Как только встречается "(" - делать к ней +1, ")" - делать -1. Строка будет распадаться на токены в тех местах, где индикатор будет из нуля переходить в не ноль и наоборот. |