-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTagScanner.java
More file actions
94 lines (82 loc) · 3.66 KB
/
TagScanner.java
File metadata and controls
94 lines (82 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package test;
/* Знакомство с тегами
Считайте с консоли имя файла, который имеет HTML-формат (C:\Temp\html.txt)
Пример:
Info about Leela <span xml:lang="en" lang="en"><b><span>Turanga Leela
</span></b></span>
Первым параметром в метод main приходит тег. Например, "span"
Вывести на консоль все теги, которые соответствуют заданному тегу
Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле
Количество пробелов, \n, \r не влияют на результат
Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нету
Тег может содержать вложенные теги
Пример вывода:
<span xml:lang="en" lang="en"><b><span>Turanga Leela</span></b></span>
<span>Turanga Leela</span>
Шаблон тега:
<tag>text1</tag>
<tag text2>text1</tag>
<tag
text2>text1</tag>
text1, text2 могут быть пустыми
*/
import java.io.*;
import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TagScanner
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
reader.close();
BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
StringBuilder stringBuilder = new StringBuilder();
while (fileReader.ready())
{
stringBuilder.append(fileReader.readLine());
}
String htmlText = stringBuilder.toString();
String openTag = "\\<" + args[0] + ".*?\\>";
String closeTag = "\\</" + args[0] + "\\>";
String allTags = "(\\<" + args[0] + ".*?\\>)|(\\</" + args[0] + "\\>)";
ArrayList<String> output = new ArrayList<>();
Stack<Integer> openTagStack = new Stack<>(); //стек с открывающими тегами <openTag>
Stack<String> tagLine = new Stack<>(); //стек с внутренними тегами (<openTag>...</closeTag>)
int innerTagCount = -1; //счётчик внутренних тегов
Pattern tagsPattern = Pattern.compile(allTags);
Matcher tagsMatcher = tagsPattern.matcher(htmlText);
while (tagsMatcher.find())
{
//если попался открывающий тег
if (tagsMatcher.group().matches(openTag))
{
openTagStack.push(tagsMatcher.start());
innerTagCount++;
}
//если попался закрывающий тег
if (tagsMatcher.group().matches(closeTag))
{
if (innerTagCount == 0)
{
output.add(htmlText.substring(openTagStack.pop(), tagsMatcher.end()));
if (!tagLine.empty())
{
while (!tagLine.empty())
output.add(tagLine.pop());
}
innerTagCount--;
}
else
{
tagLine.push(htmlText.substring(openTagStack.pop(), tagsMatcher.end()));
innerTagCount--;
}
}
}
for (String tag : output)
System.out.println(tag);
}
}