вывод 100% совпадает с примером
суть в том чтобы сделать из файла строку, заменить в ней все открывающие на "†", а закрывающие на "‡". потом из строки сделать массив символов. итератор идет по массиву и считает x. переменная x это количество открытых тегов. когда из x вычитается единица и x снова равен 0, значит найден нужный закрывающий тег. берем из строки индекс следующего после предыдущего открывающего тега (int start), индекс текущего элемента массива (int end), вырезаем нужный нам кусок строки и заменяем все "†" и "‡" обратно на теги. удаляем из массива два этих тега и начинаем заново цикл
(я знаю что получился какой-то монстр, но это все что я могу)![]()

package com.javarush.task.task19.task1918;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String path = reader.readLine();
reader.close();
BufferedReader r = new BufferedReader(new FileReader(path));
StringBuilder s = new StringBuilder();
while(r.ready())
{
s.append(r.readLine());
}
r.close();
path = s.toString().replace(("/" + args[0]), "‡");
path = path.replace(args[0], "†");
char[] c = path.toCharArray();
int x = 0, start = 0, end = 0;
for(int i = 0; i < c.length; i++)
{
if(c[i] == 8224)
x++;
else if (c[i] == 8225)
{
x--;
if ((x == 0))
{
start = path.indexOf("†", start) + 1;
end = i;
System.out.println("<" + args[0] + path.substring(start, end).replace("‡", ("/" + args[0])).replace("†", args[0]) + "/" + args[0] + ">");
c[start - 1] = 0;
c[end] = 0;
x = 0;
i = 0;
}
}
}
}
}