Объектно-ориентированное программирование Ларичева Т.В. Работа со строками в Java Ларичева Т.В. Строки представляют из себя последовательность символов. В языке программирования Java строки — это объект. Обработка строк в Java: •String, StringBuffer, StringBuilder (реализация строк) •Pattern, Matcher (регулярные выражения) String является реализацией java.lang.CharSequence 3 Ларичева Т.В. Обработка строк в Java: String, StringBuffer, StringBuilder (реализация строк) Ларичева Т.В. Класс String в Java ключевые характеристики: 5 Ларичева Т.В. Создание строк 1. Используя строковые литералы: 2. С помощью конструкторов которые позволяют: •создать объект, содержащий пустую строку •создать копию строковой переменной •создать строку на основе массива символов •создать строку на основе массива байтов (с учетом кодировок) •и т.д. 6 Ларичева Т.В. Длина Ларичева Т.В. Конкатенация — операция объединения строк, возвращает новую строку, что есть результатом объединения второй строки с окончанием первой. 1. Метод concat 2. Перегруженные операторы "+" и "+=" Ларичева Т.В. Форматирование Класс String предоставляет возможность создания форматированных строк. За это отвечает статический метод format, например: String formatString = "We are printing double variable (%f), string ('%s') and integer variable (%d)."; System.out.println(String.format(formatString, 2.3, "habr", 10)); // Мы печатаем переменную c плавающей точкой (2.300000), строку ('habr') и целочисленную переменную (10) 9 Ларичева Т.В. Сравнение строк 10 Ларичева Т.В. Получение символов и подстрок 11 Ларичева Т.В. Преобразование 1. Число в строку 2. Строку в число 12 Ларичева Т.В. Перевод коллекции строк к строковому представлению 13 Ларичева Т.В. Разбиение строки на массив строк 14 Ларичева Т.В. Определение позиции элемента в строке 15 Ларичева Т.В. Извлечение подстроки из строки 16 Ларичева Т.В. Перевод строки в верхний/нижний регистр: 17 Ларичева Т.В. Преобразование 1. Число в строку 2. Строку в число 18 Ларичева Т.В. Список всех методов класса String можно изучить в официальной документации. На работу со строками сущесвует множество задач. Например, на Coding Bat. Так же есть курс на coursera: "Algorithms on Strings". Рекомендую к просмотру доклад с JPoint 2015 года: Алексей Шипилёв — Катехизис java.lang.String https://www.youtube.com/watch?v=SZFe3m1DV1A&t=10s 19 Ларичева Т.В. StringBuffer Строки являются неизменными, поэтому частая их модификация приводит к созданию новых объектов, что в свою очередь расходует драгоценную память. Для решения этой проблемы был создан класс java.lang.StringBuffer, который позволяет более эффективно работать над модификацией строки. Класс является mutable StringBuffer может быть использован в многопоточных средах. Создание 20 Ларичева Т.В. StringBuffer Модификация используем StringBuffer для многократного выполнения операций добавления (append), вставки (insert) и удаления (delete) подстрок. Все остальные методы для работы с StringBuffer можно посмотреть в документации. 21 Ларичева Т.В. StringBuilder StringBuilder — класс, что представляет изменяемую последовательность символов. Его использование в многопоточных средах нежелательно. 22 Ларичева Т.В. Обработка строк в Java: Pattern, Matcher (регулярные выражения) https://javarush.ru/groups/posts/136-reguljarnihe-vihrazhenija-v-java-chastjh-1 Ларичева Т.В. Регулярные выражения (regular expressions) — мощное и эффективное средство для обработки текста. Они впервые были использованы в текстовых редакторах операционной системы UNIX (ed и QED) и сделали прорыв в электронной обработке текстов конца XX века. В 1987 году более сложные РВ возникли в первой версии языка Perl и были основаны на пакете Henry Spencer (1986), написанном на языке С. А в 1997 году, Philip Hazel разработал Perl Compatible Regular Expressions (PCRE) — библиотеку, которая точно наследует функциональность РВ в Perl. Сейчас PCRE используется многими современными инструментами 24 Ларичева Т.В. Регулярные выражения (regular expressions) Механизм •Существует две базовые технологии, на основе которых строятся механизмы РВ: •Недетерминированный конечный автомат (НКА) — «механизм, управляемый регулярным выражением» Детерминированный конечный автомат (ДКА) — «механизм, управляемый текстом» НКА — механизм, в котором управление внутри РВ передается от компонента к компоненту. НКА просматривает РВ по одному компоненту и проверяет, совпадает ли компонент с текстом. Если совпадает — проверятся следующий компонент. Процедура повторяется до тех пор, пока не будет найдено совпадение для всех компонентов РВ (пока не получим общее совпадение). ДКА — механизм, который анализирует строку и следит за всеми «возможными совпадениями». Его работа зависит от каждого просканированного символа текста (то есть ДКА «управляется текстом»). Даний механизм сканирует символ текста, обновляет «потенциальное совпадение» и резервирует его. Если следующий символ аннулирует «потенциальное совпадение», то ДКА возвращается к резерву. Нет резерва — нет совпадений. Регулярные выражения в Java используют механизм НКА. 25 Ларичева Т.В. Регулярные выражения (regular expressions) Подход к обработке В языках программирования существует три подхода к обработке РВ: •интегрированный •процедурный •объектно-ориентированный Для обработки регулярных выражений в Java используют объектно-ориентированный подход. Реализация 26 Ларичева Т.В. Регулярное выражение (RegEx) – это шаблон для поиска строки в тексте. В Java исходным представлением этого шаблона всегда является строка, то есть объект класса String. Однако не любая строка может быть скомпилирована в регулярное выражение, а только та, которая соответствует правилам написания регулярного выражения – синтаксису, определенному в спецификации языка. Для написания регулярного выражения используются буквенные и цифровые символы, а также метасимволы – символы, имеющие специальное значение в синтаксисе регулярных выражений. Например: 27 Ларичева Т.В. Создание регулярных выражений в Java Чтобы создать RegEx в Java, нужно сделать два простых шага: 1.написать его в виде строки с учётом синтаксиса регулярных выражений; 2.скомпилировать эту строку в регулярное выражение; Работа с регулярными выражениями в любой Java-программе начинается с создания объекта класса Pattern. Для этого необходимо вызвать один из двух имеющихся в классе статических методов compile. Первый метод принимает один аргумент – строковый литерал регулярного выражения, а второй – плюс еще параметр, включающий режим сравнения шаблона с текстом: 28 Ларичева Т.В. Синтаксис регулярных выражений Синтаксис регулярных выражений основан на использовании символов <([{\^-=$!|]})?*+.>, которые можно комбинировать с буквенными символами. В зависимости от роли их можно разделить на несколько групп: 29 Ларичева Т.В. Жадный режим квантификатора 30 Ларичева Т.В. Алгоритм поиска по заданному шаблону "А.+а", выполняется в следующей последовательности: 31 Ларичева Т.В. Сверхжадный режим квантификатора 32 Ларичева Т.В. Ленивый режим квантификатора 33 Ларичева Т.В. Экранирование символов в регулярных выражениях Символ обратной косой черты «\» в строковых литералах в исходном коде Java интерпретируется как символ управляющей последовательности, который предупреждает компилятор, что следующий за ним символ — специальный и что его нужно особым образом интерпретировать. Например: 34 Ларичева Т.В. Методы класса Pattern 35 Ларичева Т.В. Matcher 36 Ларичева Т.В. Методы класса Matcher 37 Ларичева Т.В. Ларичева Татьяна Викторовна кандид. пед. наук, доцент tatatv@yandex.ru ИНСТИТУТ ТЕХНОЛОГИЙ БИЗНЕСА Кафедра прикладной информатики и статистики 38 38