Считайте с консоли имя файла, который имеет HTML-формат. Пример: Info about Leela Turanga Leela Supergirl Первым параметром в метод main приходит тег. Например, «span«. Вывести на консоль все теги, которые соответствуют заданному тегу. Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле. Количество пробелов, n, r не влияют на результат. Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нет. Тег может содержать вложенные теги. Пример вывода: Turanga Leela Turanga Leela Super girl Шаблон тега: text1 text1 text1 text1, text2 могут быть пустыми Требования: 1. Программа должна считывать имя файла с консоли (используй BufferedReader). 2. BufferedReader для считывания данных с консоли должен быть закрыт. 3. Программа должна считывать содержимое файла (используй FileReader). 4. Поток чтения из файла (FileReader) должен быть закрыт. 5. Программа должна выводить в консоль все теги, которые соответствуют тегу, заданному в параметре метода main. Что валидатору не подходит?! Уже и лишние replaceAll где только можно впилил, что не так с валидатором?
public static void main(String[] args) throws IOException {
    String fileName = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        fileName = reader.readLine();
    }

    StringBuilder fileStringBuilder = new StringBuilder();
    try (BufferedReader file = new BufferedReader(new FileReader(fileName))){
        while (file.ready()) {
            fileStringBuilder.append(file.readLine());
        }
    }

    String fileString = fileStringBuilder.toString();

    fileString = fileString.replaceAll(System.getProperty("line.separator"),"");
    fileString = fileString.replaceAll("\n","");
    fileString = fileString.replaceAll("\r","");
    fileString = fileString.replaceAll(" {2,}"," ");

    String stringTag = args[0];
    stringTag = stringTag.replaceAll("\"", "");

    Pattern pattern = Pattern.compile("(<[ \n\r]*" + stringTag + ")|(<[ \n\r]*/[ /n/r]*" + stringTag + "[ /n/r]*>)");

    findTag(fileString, pattern);
}

static void findTag(String string, Pattern pattern) {
    Matcher matcher = pattern.matcher(string);
    int openedTagCount = 0;
    int start = 0, finish = 0;
    while (matcher.find()) {
        if (matcher.group().contains("/")) {
            if(openedTagCount == 1) {
                System.out.println(string.substring(start, matcher.end()));
                findTag(new String(string.substring(finish, matcher.start() - 1)), pattern);
                openedTagCount = 0; start = 0; finish = 0;

            } else {
                openedTagCount--;
            }
        } else {
            if(++openedTagCount == 1) {
                start = matcher.start();
                finish = matcher.end();
            }
        }
    }
}