Логіка:
1. В циклі шукаємо початок тега через indexOf і запускаємо метод, який поверне індекс закінчення тега(наступний пошук з починаємо з кінця першого тега)
2. Метод, який виріже повністю тег, з усіма дочірніми і запишемо його в ліст
2.1 після запису в ліст, в цьому ж методі шукаємо всі дочірні теги і запускаємо Метод, рекурсія, по аналогії з Пунктом1
package com.javarush.task.task19.task1918;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
/*
Знакомство с тегами
*/
public class Solution {
private static ArrayList<String> tags = new ArrayList<>();
private static String tag, pretag, sutag;
public static void main(String[] args) {
tag = args[0];
pretag = "<"+tag;
sutag = "</"+tag+">";
/*tag = "span";
pretag = "<"+tag;
sutag = "</"+tag+">";*/
StringBuilder file = new StringBuilder();
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader fr = new BufferedReader(new FileReader(br.readLine()))) {
while (fr.ready()) file.append(fr.readLine());
}catch (Exception e) {}
String str = new String(file).replaceAll("[\\r\\n]+", "");;
int i = 0, j = 0;
while((i = str.indexOf(pretag, j))>=0) {
j = search(str, i + 1);
}
for(String el: tags) {
System.out.println(el);
}
}
private static int search(String str, int startPos) {
int j = startPos, e = startPos, deep = 1;
while(deep > 0) {
e = Math.min(str.indexOf(pretag, j), str.indexOf(sutag, j));
if (e == -1) e = str.indexOf(sutag, j);
if(str.charAt(e + 1) == '/') {
deep--;
j = e + sutag.length();
} else if (str.charAt(e) == '<'){
deep++;
j = e + pretag.length();
}
}
String tagStr = str.substring(startPos - 1, j);
tags.add(tagStr);
j = tag.length();
int i;
while((i = tagStr.indexOf(pretag, j))>=0) {
j = search(tagStr, i + 1);
}
return e + tag.length();
}
}