Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб работа языки высокого уровня java (4).docx
Скачиваний:
3
Добавлен:
25.05.2024
Размер:
67.71 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ

ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

(НИУ «БелГУ»)

ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Отчет по лабораторной работе № 4 Вариант 7 Тема работы “Программирование на языке Java”

по дисциплине “Программирование на языках высокого уровня”

студента очного отделения

3 Курса 12002105 группы

Проверил:

Доц. Лифиренко Максим Александрович

Белгород, 2024

Задание

На вход программы подается произвольный html-файл, необходимо все ссылки http:// не находящиеся в теге обернуть тегом в качестве описания использовать имя домена до первого символа «/».

Например, ссылку https://www.bsu.edu.ru/bsu/resource /schedule/ teachers/ index.php? teacher=1500 необходимо заменить на <a href = “https://www.bsu.edu.ru/ bsu/resource/schedule/ teachers/ index.php? teacher=1500 ”>bsu.edu.ru </a>

Вывести в консоль статистику по обработанному файлу:

- указать ссылки с тегом и их количество повторений

- указать ссылки без тега обработанные и их повторения

Сохранить новый html-файл

Ход выполнения работы

В ходе выполнения работы была написана программа для работы с регулярными выражениями применительно к файлам.

Программа считывает данные из файла index.html в коллекцию List<String>. При этом используется библиотека java.nio.*. С помощью java.util.regex.* и входящих в этот модуль объектов Pattern и Matcher каждая строка сканируется и выбираются ссылки двух типов – с тегом <a> и без тега.

При нахождении ссылки актуализируется статистика по ссылкам каждого типа, которая хранится в двух коллекциях HashMap<String, Integer>.

После завершения обработки файла собранная по каждому типу ссылок статистика сохраняется в новый файл – index_processed.html, в котором не остаётся ни одной ссылки без тега <a>.

Результат работы программы представлен на рисунке 1.

Рисунок 1 – Результат работы программы

Листинг программы

Содержимое файла index.html:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<body style="padding:0 20%">

<p style="text-align: justify;">Lorem ipsum dolor <a href="http://google.com">google.com</a> sit amet, consectetur adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla http://google.com quis justo vestibulum lobortis tincidunt vel eros </p>

<p style="text-align: justify;"> Nunc congue urna et http://google.com tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://google.com">google.com</a> Cras magna purus, euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu<a href="http://google.com">google.com</a> turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar http://google.com eros quam, sit amet facilisis </p>

<p style="text-align: justify;">Lorem ipsum dolor http://yandex.ru sit amet, consectetur

adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla http://yandex.ru quis justo vestibulum lobortis tincidunt vel eros

</p>

<p style="text-align: justify;"> Nunc congue urna et http://yandex.ru tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. http://yandex.ru Cras magna purus,

euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu http://yandex.ru turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar http://yandex.ru eros quam, sit amet facilisis </p>

<p style="text-align: justify;">Lorem ipsum dolor <a href="http://bing.com">bing.com</a> sit amet, consectetur

adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla http://bing.com quis justo vestibulum lobortis tincidunt vel eros

</p>

<p style="text-align: justify;"> Nunc congue urna et http://bing.com tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://bing.com">bing.com</a> Cras magna purus,

euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu<a href="http://bing.com">bing.com</a> turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar http://bing.com eros quam, sit amet facilisis </p>

</body>

</html>

Содержимое файла index_processed.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<body style="padding:0 20%">

<p style="text-align: justify;">Lorem ipsum dolor <a href="http://google.com">google.com</a> sit amet, consectetur adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla <a href="http://google.com">google.com</a> quis justo vestibulum lobortis tincidunt vel eros </p>

<p style="text-align: justify;"> Nunc congue urna et <a href="http://google.com">google.com</a> tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://google.com">google.com</a> Cras magna purus, euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu<a href="http://google.com">google.com</a> turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar <a href="http://google.com">google.com</a> eros quam, sit amet facilisis </p>

<p style="text-align: justify;">Lorem ipsum dolor <a href="http://yandex.ru">yandex.ru</a> sit amet, consectetur

adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla <a href="http://yandex.ru">yandex.ru</a> quis justo vestibulum lobortis tincidunt vel eros

</p>

<p style="text-align: justify;"> Nunc congue urna et <a href="http://yandex.ru">yandex.ru</a> tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://yandex.ru">yandex.ru</a> Cras magna purus,

euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu <a href="http://yandex.ru">yandex.ru</a> turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar <a href="http://yandex.ru">yandex.ru</a> eros quam, sit amet facilisis </p>

<p style="text-align: justify;">Lorem ipsum dolor <a href="http://bing.com">bing.com</a> sit amet, consectetur

adipiscing elit. </p>

<p style="text-align: justify;"> Donec nec nulla <a href="http://bing.com">bing.com</a> quis justo vestibulum lobortis tincidunt vel eros

</p>

<p style="text-align: justify;"> Nunc congue urna et <a href="http://bing.com">bing.com</a> tincidunt bibendum </p>

<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>

<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://bing.com">bing.com</a> Cras magna purus,

euismod nec justo vitae, iaculis tristique libero </p>

<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>

<p style="text-align: justify;"> Sed quis dolor eu<a href="http://bing.com">bing.com</a> turpis feugiat iaculis </p>

<p style="text-align: justify;"> Donec pulvinar <a href="http://bing.com">bing.com</a> eros quam, sit amet facilisis </p>

</body>

</html>

Исходный код программы

package com.example;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.nio.file.StandardOpenOption;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.regex.*;

public class App {

// Two regex for link with and without <a> tag

static String regexLinksWOTag = "https?://[a-zA-Z0-9_.-]*(\\s|<)";

static String regexLinkWithTag = "href=\"https?://[a-zA-Z0-9_.-]*\\\"";

public static void main(String[] args) {

System.out.println("\n\nНачало работы программы");

// Two HashMap collections for count of links with and without tag

HashMap<String, Integer> linksWOTagStatistic = new HashMap<String, Integer>();

HashMap<String, Integer> linksWithTagStatistic = new HashMap<String, Integer>();

System.out.println("Попытка открыть файл");

try {

// Get all lines from file using nio library

List<String> linesFromFile = Files.readAllLines(Paths.get("index.html"));

List<String> processedLinesToWrite = new ArrayList<String>();

System.out.println("Файл успешно открыт, строки прочитаны");

System.out.println("Начало поиска строк по шаблону");

// Go through whole collection

for (String line : linesFromFile) {

try {

// Compile pattern and create matcher object for links with tag

// This pattern doesn't modify lines, therefore it should go first

Pattern withTagPattern = Pattern.compile(regexLinkWithTag);

Matcher withTagMatcher = withTagPattern.matcher(line);

if (withTagMatcher.find()) {

// Get link text

String link = withTagMatcher.group(0).trim();

// Get link text without href and other stuff using split

String raw_link_text = link.split("\"")[1];

// Add link to hashMap

updateHashMap(linksWithTagStatistic, raw_link_text);

}

// Complile pattern and create matcher objects for links without tag

Pattern WOTagLinkPattern = Pattern.compile(regexLinksWOTag);

Matcher WOTagMatcher = WOTagLinkPattern.matcher(line);

// If something was found

if (WOTagMatcher.find()) {

// Extract link from file and remove space in the end

String link = WOTagMatcher.group(0).trim();

// Extract domain using simple split method

String domain = link.split("/")[2];

// Add tag for the link

String linkWTag = String.format("<a href=\"%s\">%s</a>", link, domain);

line = line.replaceFirst(link, linkWTag);

// Update count of such links in hashmap

updateHashMap(linksWOTagStatistic, link);

}

// Add processed line to the other collection

processedLinesToWrite.add(line);

}

// Raise exception if something is wrong with pattern

catch (PatternSyntaxException e) {

System.out.println("Произошла ошибка при попытке компилировать паттерн");

System.out.println("Текст ошибки: " + e.getMessage());

}

}

System.out.println("\nРезультаты поиска:");

// Print links without tag

System.out.println("\nСсылки без тега");

printHashMapToConsole(linksWOTagStatistic);

// Print links with tag

System.out.println("\nСсылки с тегом");

printHashMapToConsole(linksWithTagStatistic);

// Write processed lines down to a new file

Path pathToProcessedIndex = Paths.get("index_processed.html");

try{

Files.write(pathToProcessedIndex, processedLinesToWrite);

System.out.println("\nОбработанные строки были успешно записаны в новый файл index_processed.html");

}

catch (Exception e){

System.out.println("Произошла неизвестная ошибка при записи файла");

System.out.println(e.getMessage());

}

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("\n\n");

}

// Function to add new link with counter to hash map or just update counter if

// map already contains that link

static void updateHashMap(HashMap<String, Integer> linksCollection, String link) {

if (linksCollection.containsKey(link)) {

int count = linksCollection.get(link);

linksCollection.put(link, count + 1);

} else {

linksCollection.put(link, 1);

}

}

// Function to print whole hash map to console using formatted output

static void printHashMapToConsole(HashMap<String, Integer> object) {

int i = 0;

for (HashMap.Entry<String, Integer> entry : object.entrySet()) {

System.out.printf("%d. %s - %d шт\n", i + 1, entry.getKey(), entry.getValue());

i++;

}

}

}