Регулярные выражения не подходят для анализа древовидных структур произвольной глубины. Это может быть возможно, в зависимости от используемого вами выражения regex, но не рекомендуется - их сложно читать и отлаживать.
Я бы предложил вместо этого написать простой парсер. Что вы делаете, это разлагаете свой текст на набор возможных токенов , каждый из которых может быть определен простыми регулярными выражениями, например ::
START_TOKEN = "<!-- START [A-Za-z] -->"
END_TOKEN = ...
HTML_TEXT = ...
Итерация по вашей строке, и, пока вы сопоставляете эти токены, извлекайте их из строки и сохраняйте их в отдельном списке. Обязательно сохраните текст, который был внутри токена (если есть), когда вы делаете это.
Затем вы можете перебирать свой список токенов, и на основе типов токенов вы можете создать вложенную древовидную структуру узлов, каждый из которых содержит либо 1) текст исходного токена, и 2) список дочерних узлов.
Возможно, вы захотите взглянуть на некоторые руководства по синтаксическому анализу, если это кажется слишком сложным.