Получилось не очень красиво, но вывод корректный для разных примеров. Не могу найти ошибку.
package com.javarush.task.task19.task1918;

/*
Знакомство с тегами
*/

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    public static void main(String[] args) throws Exception{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String filePath = reader.readLine();
        reader.close();

        BufferedReader fileReader = new BufferedReader(new FileReader(filePath));

        StringBuilder stringBuilder = new StringBuilder("");

        while (fileReader.ready()) {
            stringBuilder.append(fileReader.readLine()); // если несколько строк, то создаём одну
        }

        fileReader.close();

        String for_open = "<" + args[0];                   //паттерн для открытия тега
        String for_close = "</" + args[0] + ">";         //паттерн для закрытия тега

        Pattern p_open = Pattern.compile(for_open);
        Pattern p_close = Pattern.compile(for_close);

        String tmp = stringBuilder.toString();         // наша итоговая строка
        Matcher m_open = p_open.matcher(tmp);
        Matcher m_close = p_close.matcher(tmp);

        TreeMap<Integer,String> treeMap = new TreeMap<Integer, String>();    // упорядочить очередь появления тегов

        while (m_open.find()) {
            treeMap.put(m_open.start(),"open");        // загоняем все открытые теги
        }
        while (m_close.find()) {
            treeMap.put(m_close.end()-1,"close");    // загоняем все закрытые теги
        }

        ArrayList<Integer> str_from = new ArrayList();    // список для substr_from
        ArrayList<Integer> str_to = new ArrayList();        // список для substr_to

        int i = 0;    // вспомогательная переменная

        for (Map.Entry<Integer,String> pair : treeMap.entrySet()) {
            if (pair.getValue().equals("open")) {
                str_from.add(pair.getKey());               // список позиций открытых тегов
                i = 0;                                                   // флаг для последнего открытого тега
            }
            if (pair.getValue().equals("close")) {
                if (i == 0) {                                         // закрываем последний открытый тег
                str_to.add(pair.getKey());
                i++;}
                else {                              // если закрываем 2 раза подряд - значит и более ранние теги закрываются
                str_to.add(0,pair.getKey());}            // ставим более ранние теги в начало
            }
        }

        for (int j = 0; j < str_from.size(); j++) {
            System.out.println(tmp.substring(str_from.get(j), str_to.get(j)+1));   //вывод
        }

    }
}