Самый простой из известных мне способов найти только одну из самых внутренних скобок - это:
var match = Regex.Match(input, @"^.*(\[\[(.*?)\]\])", RegexOptions.Singleline);
Это работает, потому что он находит last [[
(поэтому после него нет больше [[
, поэтому он не может содержать вложенных тегов), а затем сразу следующий ]]
. Конечно, это предполагает правильность; если у вас есть строка, в которой начальные / конечные скобки не совпадают должным образом, это может привести к ошибке.
Как только вы нашли самую внутреннюю скобку, вы можете удалить ее из строки ввода:
input = input.Remove(match.Groups[1].Index, match.Groups[1].Length);
, а затем повторите процесс в цикле while, пока регулярное выражение не перестанет совпадать.