Как разделить строку где встречаются два тега, при этом название тегов может быть любое в Java

Есть строка:

<h1><h1>hello my dear friend</h1></h1><par>what's up</par>

Мне необходим разделить на две строки, где встречаются теги </h1><par>, при этом название закрывающейся тега сохранить в первой строке, а открывающейся во второй, также проблема в том что название тегов может быть любое.

Ожидаемый результат:

<h1><h1>hello my dear friend</h1></h1>
<par>what's up</par>

Пока получилось разделить только по одному символу и приклеить его в начала строки, или в конец:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int testCases = Integer.parseInt(in.nextLine());
    while (testCases > 0) {
        String line = in.nextLine();
        String arr[] = line.split("(?<=(<)");
        for (String m: arr) {
            System.out.println(m);
        }
        testCases--;
    }
}

Ответы (2 шт):

Автор решения: Alex Rudenko

Можно просто вставить \n между любым закрывающим и открывающим тэгами, используя String::replaceAll:

String html = "<h1><h1>hello my dear friend</h1></h1><par>what's up</par>";
System.out.println(html.replaceAll("(</\\w+>)(<\\w+>)", "$1\n$2"));

Вывод:

<h1><h1>hello my dear friend</h1></h1>
<par>what's up</par>
→ Ссылка
Автор решения: ilyapl1994

Более "топорный" способ:

public static void main(String[] args) {
   TestClass test=new TestClass();
   String html="<h1></h1><h2></h2><h3></h3><h3></h3><h1></h1><h2></h2>";
   String tag1="</h1>";
   String tag2="<h2>";
   String[] res=test.parse(html, tag1, tag2);
    for(String s:res) System.out.println("str="+s);
}
public String[] parse(String html, String tag1, String tag2){
    String[] splitResult=html.split(tag1+tag2);
    String[] result=new String[splitResult.length];
    int i=0;
    for (String s:splitResult){
        if (i==0){
            result[i]=s+tag1; i++;continue;}
        if (i==splitResult.length-1) {
            result[i]=tag2+s;i++;continue;}
    result[i]=tag2+s+tag1;
    i++;
    }
    return result;
}
→ Ссылка