Считайте с консоли имя файла, который имеет 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();
}
}
}
}