тестовый ввод: Info about Leela <span xml:lang="en" lang="en"><span></span></b></span><span>Super</span><span></span> код который проходит валидацию, выдает явно неверное решение: <spanxml:lang="en" lang="en"><span></span></b></span> <span></span> <span>Super</span> <span></span> мой код выводит: <span xml:lang="en" lang="en"><span></span></b></span> <span>Super</span> <span></span> ниже мой код:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

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

public class s1 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String fileName = br.readLine();
        isr.close();
        br.close();
        FileReader fr = new FileReader(fileName);
        ArrayList<Character> charsList = new ArrayList<>();
        while (fr.ready())
            charsList.add((char) fr.read());
        fr.close();
        String tag = args[0];
        int off = 0;
        int[] b;
        while (null != (b = betweenTags(tag, charsList, off))) {
            System.out.println(subCharListToString(charsList, b[0], b[1]));
            off = b[1];
        }

    }

    static String subCharListToString(ArrayList<Character> lst, int off, int end) {
        if (lst == null) return null;
        if (lst.size() == 0) return "";
        if (off < 0) off = 0;
        if (end <= 0) return null;
        int size = lst.size();
        if (end > size) end = size;
        char[] chars = new char[end - off];
        for (int i = 0; i < chars.length; i++)
            chars[i] = lst.get(off + i).charValue();
        return String.copyValueOf(chars);
    }

    static String subCharListToString(ArrayList<Character> lst, int off) {
        if (lst == null) return null;
        return subCharListToString(lst, off, lst.size());
    }

    static String subCharListToString(ArrayList<Character> lst) {
        if (lst == null) return null;
        return subCharListToString(lst, 0, lst.size());
    }

    static int[] betweenTags(String tag, ArrayList<Character> charsList, int off) {
        int[] open1 = findBoundariesOpeningTag(tag, charsList, off);
        if (open1 == null)
            return null;
        int[] close = findBoundariesСlosingTag(tag, charsList, open1[1]);
        if (close == null)
            return null;
        int[] open2 = findBoundariesOpeningTag(tag, charsList, open1[1]);
        if ((open2 == null) || (open2[0] > close[0]))
            return new int[]{open1[0], close[1]};
        int[] bts = betweenTags(tag, charsList, open1[1]);
        if (bts == null) return null;
        close = findBoundariesСlosingTag(tag, charsList, bts[1]);
        if (close == null) return null;
        return new int[]{open1[0], close[1]};
    }

    static boolean isSubset(String str, ArrayList<Character> charsList, int off) {
        if (str == null) return false;
        if (charsList == null) return false;
        if (off < 0) return false;
        if (off >= charsList.size()) return false;
        if (str.length() == 0) return true;
        if (charsList.size() == 0) return false;
        if (charsList.size() < (off + str.length()))
            return false;
        for (int i = 0; i < str.length(); i++)
            if (charsList.get(off + i).charValue() != str.charAt(i))
                return false;
        return true;
    }

    static int[] findBoundariesСlosingTag(String tag, ArrayList<Character> charsList, int off) {
        if (tag.length() < 1)
            return null;
        if (off < 0) off = 0;
        if ((off + 3 + tag.length()) > charsList.size())
            return null;
        int end = charsList.size() - tag.length() - 2;
        for (int i = off; i < end; i++)
            if (charsList.get(i).charValue() == '<')
                if (((i + 1) < charsList.size()) && (charsList.get(i + 1).charValue() == '/'))
                    if (isSubset(tag + ">", charsList, i + 2))
                        return new int[]{i, i + tag.length() + 3};
        return null;
    }

    static int[] findBoundariesOpeningTag(String tag, ArrayList<Character> charsList, int off) {
        if (tag.length() < 1)
            return null;
        if (off < 0) off = 0;
        if ((off + 2 + tag.length()) > charsList.size())
            return null;
        int end = charsList.size() - tag.length() - 1;
        int i;
        for (i = off; i < end; i++)
            if (charsList.get(i).charValue() == '<')
                if (charsList.get(i + 1).charValue() != '/')
                    if (isSubset(tag, charsList, i + 1) && (
                            charsList.get(i + 1 + tag.length()).charValue() == ' ' ||
                            charsList.get(i + 1 + tag.length()).charValue() == '>' ||
                            charsList.get(i + 1 + tag.length()).charValue() == '\n' ||
                            charsList.get(i + 1 + tag.length()).charValue() == '\r'
                    ))
                        break;
        if (i >= end)
            return null;
        int j;
        for (j = i + 1 + tag.length(); j < charsList.size(); j++)
            if (charsList.get(j).charValue() == '>')
                break;
        if (j >= charsList.size()) return null;
        return new int[]{i, j + 1};
    }
}