package com.javarush.task.task19.task1918;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
FileReader fr = new FileReader(br.readLine());
br.close();
String tag = args[0];
BufferedReader buffer = new BufferedReader(fr);
StringBuilder sb = new StringBuilder();
while (buffer.ready()) {
sb.append(buffer.readLine());
}
fr.close();
String target = sb.toString(); /*.replace("\r", "").replace("\n", "")*/ //думал из-за этого, но нет
ArrayList<Integer> openTags = new ArrayList<>();
ArrayList<Integer> closeTags = new ArrayList<>();
String openTag = "<" + tag + "\\b.*?>"; //открывающий тэг
String closeTag = "</" + tag + ">"; //закрывающий тэг
Pattern patternOpen = Pattern.compile(openTag);
Pattern patternClose = Pattern.compile(closeTag);
Matcher matcherOpen = patternOpen.matcher(target);
Matcher matcherClose = patternClose.matcher(target);
while (matcherOpen.find()){
openTags.add(matcherOpen.start()); //пихаем координаты начал всех открывающих тэгов в список
}
while (matcherClose.find()) {
closeTags.add(matcherClose.end()); //а координаты концов закрывающих в другой список
}
TreeMap<Integer, Integer> indexMap = new TreeMap<>();
for (int i = 0; i < closeTags.size(); i++) { //в цикле находим вложенные тэги (г*нокодец, но рабочий)
int j = 0;
while (openTags.size() > 1 && openTags.get(j) < closeTags.get(i)) {
j++;
}
if (openTags.size() > 1) {
indexMap.put(openTags.get(j-1), closeTags.get(i));
openTags.remove(j-1);
} else {
indexMap.put(openTags.get(j), closeTags.get(i));
}
}
for (Iterator iterator = indexMap.keySet().iterator(); iterator.hasNext();) {
int left = (int) iterator.next();
int right = indexMap.get(left);
System.out.print(target.substring(left, right));
if(iterator.hasNext()) System.out.print("\n");
}
}
}Андрей Пушкин
1 уровень
Вывод какой надо, а валидатор не принимает. Кто поможет? Скорее всего регулярки не правильные.
Архивный
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Pavlo PlynkoJava-разработчик в CodeGymExpert
6 ноября 2017, 10:46
Немного юмора.
0
Андрей ПушкинFullStack Developer в EPAM Systems LLC
7 ноября 2017, 06:55
Спасибо, эт я видел, когда сам гуглил про парсинг регулярками тэгов. Даже в теме по этой задаче ссылочку выкладывал. Ну а задачу я таки сдал, скопипастив регулярки у кого-то из решения. Мои так и не подошли. При этом все тесты и ваши и от других советующих - проходят на моем коде. Закрываем, продолжаем дальше пилить. Спасибо!
0
Pomidor
27 октября 2017, 14:50
как так? вы же дали такой замечательный пост про regex & html
0
Андрей ПушкинFullStack Developer в EPAM Systems LLC
27 октября 2017, 22:14
Pomidor, тут в задаче это неявно требуется - не пользоваться сторонними парсерами хтмл.
0
Pavlo PlynkoJava-разработчик в CodeGymExpert
27 октября 2017, 14:33
Файл для теста:
0