Тестим на строке предложенной JR.
При запуске первые два строки выдает верно:
<span xml:lang="en" lang="en"><b><span>Turanga Leela</span>
<span> Turanga Leela</span>
А далее идет радостная весть, мол код ваш говно и вообще.
java.lang.StringIndexOutOfBoundsException: start -1, end 68, length 68
На этот счет у меня был предусмотрен хирый маневр. Который (что характерно) нифига не работает.
catch (StringIndexOutOfBoundsException e) {
// Хитрый маневр
// Если закрывающий тег идет раньше чем открывающий - удаляем закрывающий тег из строки.
e.printStackTrace();
stringBuilder.delete(endTagIndex, (endTagIndex + tag.length()));
}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;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) throws IOException {
String fileName;
fileName = "C:\\test.txt"; // remove before use
// try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
// fileName = br.readLine();
// }
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader fr = new BufferedReader(new FileReader(fileName))){
while (fr.ready()) {
stringBuilder.append(fr.readLine());
}
}
String tag = args[0];
int startTagIndex = 0;
int endTagIndex = 0;
String tagBegin = "<" + tag;
String tagEnd = "</" + tag + ">";
ArrayList<String> answer = new ArrayList<>();
String fileContent = stringBuilder.toString().replaceAll("\r\n", "");
while (fileContent.contains(tagBegin)) {
startTagIndex = stringBuilder.indexOf(tagBegin);
endTagIndex = stringBuilder.indexOf(tagEnd) + tagEnd.length();
try {
answer.add(stringBuilder.substring(startTagIndex, endTagIndex));
stringBuilder.delete(startTagIndex, (startTagIndex + tag.length()));
} catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
stringBuilder.delete(endTagIndex, (endTagIndex + tag.length()));
}
}
for (String x : answer) System.out.println(x);
}
}