Строки и регулярные выражения

Содержание

Слайд 2

Строки и регулярные выражения

Понятие класса.
Класс — в объектно-ориентированном программировании, представляет собой

Строки и регулярные выражения Понятие класса. Класс — в объектно-ориентированном программировании, представляет
шаблон для создания объектов, обеспечивающий начальные значения состояний: инициализация полей-переменных и реализация поведения функций или методов.

объекты

Все экземпляры одного класса созданы по одному шаблону, поэтому имеют один и тот же набор полей и методов.

Слайд 3

Строки и регулярные выражения

Понятие класса.

Объектно-ориентированное программирование сводится к созданию некоторого количества

Строки и регулярные выражения Понятие класса. Объектно-ориентированное программирование сводится к созданию некоторого
классов, включая интерфейс и реализацию, и последующему их использованию.
Графическое представление некоторого количества классов и связей между ними называется диаграммой классов.
Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.

Используемые человеком классификации в зоологии, ботанике, химии, деталях машин, несут в себе основную идею, что любую вещь всегда можно представить частным случаем некоторого более общего понятия. Конкретное яблоко — это в целом некоторое яблоко, вообще яблоко, а любое вообще яблоко — фрукт.

Слайд 4

Строки и регулярные выражения

class ИмяКласса{
модификаторы тип переменнаяЭкземпляра1;
...
модификаторы тип

Строки и регулярные выражения class ИмяКласса{ модификаторы тип переменнаяЭкземпляра1; ... модификаторы тип
переменнаяЭкземпляраN;
модификаторы ИмяКласса ( список параметров) {
// тело метода конструктора1
}

модификаторы ИмяКласса (список параметров ) {
// тело метода конструктораN
}
модификаторы тип имяМетода1 ( список параметров) {
// тело метода1
}

модификаторы тип имяМетодаN (список параметров ) {
// тело методаN
}
}

Слайд 5

Строки и регулярные выражения

Строки — представляют собой последовательность символов. Строки в

Строки и регулярные выражения Строки — представляют собой последовательность символов. Строки в
Java широко используются и являются объектами.
Платформа Java предоставляет класс строк (class String) для создания и работы со строками.

Класс String предоставляет ряд методов для манипуляции строками. По факту объект String – ссылка на область в памяти, в которой последовательно размещены символы.

Класс терминальный (финальный), то есть создать подклассы на его основе невозможно.

Слайд 6

Строки и регулярные выражения

Строка – последовательность символов.
Для создания новой строки

Строки и регулярные выражения Строка – последовательность символов. Для создания новой строки
мы можем использовать один из 11 конструкторов класса String, либо напрямую присвоить строку в двойных кавычках (строковый литерал):

Слайд 7

Строки и регулярные выражения

При работе со строками важно понимать, что объект

Строки и регулярные выражения При работе со строками важно понимать, что объект
String является неизменяемым (immutable). То есть при любых операциях над строкой, которые изменяют эту строку, фактически будет создаваться новая строка.

Слайд 8

Строки и регулярные выражения

В Java, 2 способа создания строк неявный, с

Строки и регулярные выражения В Java, 2 способа создания строк неявный, с
помощью присваивания строкового литерала и явный путем создания  объекта, при помощи оператора new 
String s1 = "Hello"; // String literal
String s2 = new String("Hello");  // String object

Java предоставляет специальный механизм для хранения строковых литералов так называемый пул (string common pool или string literal pool (общее хранилище строк).
Если несколько объектов имеют одинаковое содержимое, то они будут использовать одно и тоже значение из пула. Чтобы снизить число строковых объектов, создаваемых виртуальной машиной, каждый раз, при создании нового строкового литерала,  JVM сначала проверяет пул если такой строки в пуле нет, то создается новый String объект, который ложится в пул.
Это возможно так как строки неизменяемые (immutable), то есть могут взаимно использоваться без опасения о том, что данные будут изменены.

Слайд 9

Строки и регулярные выражения

С другой стороны объекты созданные с помощью оператора

Строки и регулярные выражения С другой стороны объекты созданные с помощью оператора
new и конструктора хранятся не в пуле, а в heap - е. Каждый heap объект в хипе имеет свой собственный экземпляр, точно также, как любой другой объект. Нет механизма повторного использования данных в хипе

Слайд 10

Строки и регулярные выражения

Такой способ создания объекта не рекомендуется:
String s =

Строки и регулярные выражения Такой способ создания объекта не рекомендуется: String s
new String(“Hello”);
JVM сначала проверит пул если в нем нет литерала “Hello”, создаст его. Затем будет создан новый объект, при помощи оператора new и конструктора с входным параметром “Hello”. Аргумент конструктора String - " Hello " - сам является экземпляром класса String и функционально равнозначен всем объектам, создаваемым конструктором. Если этот оператор попадает в цикл или в часто вызываемый метод, без всякой надобности могут создаваться миллионы экземпляров String.
Исправленная версия выглядит просто:
String s ="Hello";
В этом варианте используется единственный экземпляр String вместо создания новых при каждом проходе

Слайд 11

Строки и регулярные выражения

Создание строк при помощи оператора new может быть

Строки и регулярные выражения Создание строк при помощи оператора new может быть
полезным, только в очень специфических случаях.
Вот пример плохого использования. При использование java до v 7 update 6 метод substring при том, что возвращал новую строку, но продолжал хранить ссылку на входящее значение.
Сборщик мусора не мог удалить объект. То есть если мы получаем строку длиной 5000 символов и хотим лишь получить её префикс, используя метод substring(), то 5000 символов будут продолжать храниться в памяти.
Для систем, которые получают и обрабатывают множество сообщений, это может быть серьезной проблемой.
Для того, чтобы избежать данную проблему, можно использовать два варианта:
String prefix = new String( longString.substring(0,5) ); 

Слайд 12

Строки и регулярные выражения

Статический метод класса String - format() позволяет форматирование:

%[аргумент_индекс][флаги][ширина][.точность]символ_преобразования

Строки и регулярные выражения Статический метод класса String - format() позволяет форматирование: %[аргумент_индекс][флаги][ширина][.точность]символ_преобразования

Слайд 13

Строки и регулярные выражения

Длина строки (length())

Объединение строк (+ или concat)

Строки и регулярные выражения Длина строки (length()) Объединение строк (+ или concat)

Слайд 14

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 15

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 16

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 17

Строки и регулярные выражения

Метод charAt() — возвращает символ, расположенный по указанному

Строки и регулярные выражения Метод charAt() — возвращает символ, расположенный по указанному
индексу строки (индексы строк начинаются с нуля).

Метод split() — разделяет строку по признаку

Слайд 18

Строки и регулярные выражения

Метод compareTo() имеет два варианта. Первый: метод сравнивает строку

Строки и регулярные выражения Метод compareTo() имеет два варианта. Первый: метод сравнивает
с другим объектом, а второй: метод лексически сравнивает две строки.

Результат compareTo() получает значение 0, если аргумент является строкой лексически равной данной строке; значение меньше 0, если аргумент является строкой лексически большей, чем сравниваемая строка; и значение больше 0, если аргумент является строкой лексически меньшей этой строки.

Метод hashCode() — возвращает хэш-код для данной строки. Хэш-код вычисляется для объекта String: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],  где s[i] — i-ый символ строки, n — длина строки, и ^ возведение в степень.

Метод trim() — возвращает копию строки с пропущенными начальными и конечными пробелами, другими словами метод позволяет в Java удалить пробелы в начале и конце строки.

Слайд 19

Строки и регулярные выражения

Метод indexOf() имеет следующие варианты:
public int indexOf(int ch)

Строки и регулярные выражения Метод indexOf() имеет следующие варианты: public int indexOf(int
— возвращает индекс в данной строке первого вхождения указанного символа или -1, если символ не встречается.
public int indexOf(int ch, int fromIndex) — возвращает индекс в данной строке первого вхождения указанного символа, начиная поиск по указанному индексу, или значение -1, если символ не встречается.
int indexOf(String str) — возвращает индекс в данной строке первого вхождения указанной подстроки. Если эта подстрока не встречается, возвращается -1.
int indexOf(String str, int fromIndex) — возвращает индекс в данной строке первого вхождения указанной подстроки, начиная с указанного индекса. Если не встречается, возвращается -1.

Метод replace() — возвращает новую строку, заменив все вхождения oldChar, в данной строке, на newChar,

Слайд 20

Строки и регулярные выражения

Метод substring() возвращает новую строку, которая является подстрокой данной

Строки и регулярные выражения Метод substring() возвращает новую строку, которая является подстрокой
строки. Имеет два варианта. Подстрока начинается с символа, заданного индексом, и продолжается до конца данной строки или до endIndex-1, если введен второй аргумент.

Метод toCharArray() — в Java преобразует данную строку в новый массив символов.

Слайд 21

Строки и регулярные выражения

Метод toLowerCase() - два варианта.
Первый вариант преобразует все

Строки и регулярные выражения Метод toLowerCase() - два варианта. Первый вариант преобразует
символы в данной строки в нижний регистр, используя правила языкового стандарта. Это эквивалент вызова toLowerCase(Locale.getDefault()).
Второй вариант принимает языковой стандарт в качестве аргумента для использования во время преобразования в нижний регистр.

Метод toUpperCase() - два варианта.
Первый вариант преобразует все знаки в данной строке в верхний регистр, используя правила данного языкового стандарта. Это эквивалент вызова toUpperCase(Locale.getDefault()).
Второй вариант принимает языковой стандарт в качестве аргумента для использования во время преобразования в верхний регистр.

Слайд 22

Строки и регулярные выражения

Метод valueOf() имеет много вариантов, которые зависят от

Строки и регулярные выражения Метод valueOf() имеет много вариантов, которые зависят от
передаваемых параметров. Этот метод возвращает строковое представление переданного аргумента:

valueOf(boolean b) — возвращает строковое представление логического аргумента.
valueOf(char c) — возвращает строковое представление char аргумента.
valueOf(char[ ] data) — возвращает строковое представление массив char аргументов.
valueOf(char[ ] data, int offset, int count) — возвращает строковое представление определенного подмассива массив char аргументов.
valueOf(double d) — возвращает строковое представление double аргумента.
valueOf(float f) — возвращает строковое представление float аргумента.
valueOf(int i) — возвращает строковое представление int аргумента.
valueOf(long l) — возвращает строковое представление long аргумента.
valueOf(Object obj) — возвращает строковое представление объекта аргумента.

Слайд 23

Строки и регулярные выражения

Классы StringBuilder и StringBuffer

Классы StringBuffer и StringBuilder используются, при

Строки и регулярные выражения Классы StringBuilder и StringBuffer Классы StringBuffer и StringBuilder
необходимости сделать много изменений в строке символов.

Объекты String являются неизменяемыми, поэтому все операции, которые изменяют строки, фактически приводят к созданию новой строки, что ухудшает производительность приложения.
Классы StringBuffer и StringBuilder по сути напоминает расширяемую строку, которую можно изменять, а не пересоздавать.

Различие. Класс StringBuffer синхронизированный и потокобезопасный (принято использовать в многопоточных приложениях, где объект данного класса может меняться в различных потоках). Класс StringBuilder, работает быстрее, чем StringBuffer в однопоточных приложениях (потокоНЕбезопасный).
В целом оба класса имеют одинаковый набор конструкторов и методов

Слайд 24

Строки и регулярные выражения

Классы StringBuilder и StringBuffer имеют по четыре конструктора:

StringBuffer()

Строки и регулярные выражения Классы StringBuilder и StringBuffer имеют по четыре конструктора:
- конструктор без параметров резервирует в памяти место для 16 символов
StringBuffer(int capacity) - в качестве параметра принимает количество символов
StringBuffer(String str) - принимают строку плюс при этом резервируя память для дополнительных 16 символов
StringBuffer(CharSequence chars) - принимают набор символов, при этом резервируя память для дополнительных 16 символов

Метод length() возвращает реальную.
Метод capacity() возвращает строку плюс резерв

Слайд 25

Строки и регулярные выражения

Получить реальную строку, которая хранится в StringBuilder, используют

Строки и регулярные выражения Получить реальную строку, которая хранится в StringBuilder, используют
стандартный метод toString():

Метод ensureCapacity() позволяет изменить минимальную емкость буфера символов:

Слайд 26

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 27

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 28

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 29

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 30

Строки и регулярные выражения

Строки и регулярные выражения

Слайд 31

Строки и даты

Строки и даты

Слайд 32

Строки и даты

Строки и даты

Слайд 33

Строки и даты

Дана строка символов. Показать номера символов, совпадающих с последним

Строки и даты Дана строка символов. Показать номера символов, совпадающих с последним
символом строки.

2.1 Дана строка символов. В данной строке найти количество цифр.

2.2 Дана строка символов. В данной строке найти количество цифр от 1 до 5.

3. Удалите в строке все 'abc', за которыми следует цифра.

4. Дан текст. Найти сумму имеющихся в нем цифр.

Слайд 34

Строки и Регулярные выражения

Регулярные выражения - инструмент для обработки строк.
Регулярные

Строки и Регулярные выражения Регулярные выражения - инструмент для обработки строк. Регулярные
выражения позволяют задать шаблон, которому должна соответствовать строка или подстрока.
Есть методы класса String, которые принимают регулярные выражения и используют их для выполнения операций над строками.

Пакет java.util.regex поддерживает обработку регулярных выражений (regular expression).
Пакет содержит два класса - Pattern и Matcher. Класс Patern применяется для задания регулярного выражения. Класс Matcher сопоставляет шаблон с последовательностью символов.

Регулярное выражение состоит из обычных символов, наборов символов и групповых символов.
Обычные символы используются как есть. Если в шаблоне указать символы “abc”, то эти символы и будут искаться в строке.

Символы новой строки, табуляции и др. определяются при помощи стандартных управляющих последовательностей, которые начинаются с обратного слеша (\). Например, символ новой строки можно задать как \n.

Слайд 35

Строки и Регулярные выражения

Наборы символов заключаются в квадратные скобки. Например, [abc] совпадает с

Строки и Регулярные выражения Наборы символов заключаются в квадратные скобки. Например, [abc]
символами a, b, c. Если поставить символ ^ перед набором символов - [^abc], то ищутся совпадения всех символов, кроме a, b, c.
Чтобы задать диапазон символов, используется дефис. Например, диапазон от 1 до 9 можно задать как [1-9].
Символ точки является групповым символом, который совпадает с любым символом вообще.
Также можно задать, сколько раз совпадает выражение:
+ - совпадает один или более раз
* - совпадает ноль или более раз
? - совпадает ноль или один раз

Слайд 36

Строки и Регулярные выражения

Примеры,
Выражение -?\\d+ будет искать число, у которого может быть

Строки и Регулярные выражения Примеры, Выражение -?\\d+ будет искать число, у которого
минус (а может и нет).
Выражение a.c позволит найти слова abc, acc, но не abbc.

Слайд 37

Строки и Регулярные выражения

a? - a один раз или ни разу
a*

Строки и Регулярные выражения a? - a один раз или ни разу
- a ноль или более раз
a+ - a один или более раз
a{n} - a n раз
a{n,}- a n или более раз
a{n,m}- a от n до m

Примеры регулярных выражений:

Слайд 38

Строки и Регулярные выражения

Регулярное выражение или соответствует тексту (его части) или

Строки и Регулярные выражения Регулярное выражение или соответствует тексту (его части) или
нет. Если регулярное выражение совпадает с частью текста, то мы можем найти его. Если регулярное выражение составное, то мы можем легко выяснить, какая часть регулярного выражения совпадает с какой частью текста.

Например, строка:

Используются файлы file1.doc, file2.txt.
А еще было бы неплохо обратить внимание на файл file3.img.
Также просмотрите содержимое file4.doc.

Из строки нужно вырезать все имена файлов: file1.doc, file2.txt, file3.img, file4.doc.
Для нахождения используется регулярное выражение:
[a-zA-Z0-9]+\\.[a-z]{3}

Регулярное выражение [a-z]+ соответствует всем строчным буквам в тексте. [a-z] означает любой символ от a до z включительно, и + означает «один или более» символов.

Слайд 39

Строки и Регулярные выражения

Pattern и Matcher классы
Pattern класс - объект класса

Строки и Регулярные выражения Pattern и Matcher классы Pattern класс - объект
составляет представление регулярного выражения. Класс Pattern не предусматривает никаких публичных конструкторов. Чтобы создать шаблон, необходимо сначала вызвать один из публичных статических методов, которые затем возвращают объект класса Pattern. Эти методы принимают регулярное выражение в качестве аргумента.
Matcher класс - объект «Искатель» является двигателем, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и Pattern класс, Matcher не имеет публичных конструкторов. Вы получаете объект Matcher вызовом метода matcher(), на объекте класса Pattern.
Методы класса Matcher:
matches() возвращает true, если шаблон соответствует всей строке, иначе false.
lookingAt() возвращает true, если шаблон соответствует началу строки, и false в противном случае.
find() возвращает true, если шаблон совпадает с любой частью текста.

Слайд 40

Строки и Регулярные выражения

Сравнение регулярного выражения с текстом

Простой валидатор ссылки

Строки и Регулярные выражения Сравнение регулярного выражения с текстом Простой валидатор ссылки

Слайд 41

Строки и Регулярные выражения

Регулярное выражение для проверки email

Методы Pattern.split(), String.split()

Строки и Регулярные выражения Регулярное выражение для проверки email Методы Pattern.split(), String.split()