Similar presentations:
Строки, регулярные выражения, локализация и интернационализация. Лекция 5
1. Лекция 5 Строки, регулярные выражения, локализация и интернационализация
2. План
1. Строки2. StringBuffer и StringBuilder
3. Форматирование строк
4. Регулярные выражения
5. Локализация и интернационализация
3. Строки
Системная библиотека Java содержит следующие классы,поддерживающие работу со строками в Java и определенные в
пакете java.lang, подключаемом
автоматически: String, StringBuilder, StringBuffer.
Эти классы объявлены как final, что означает невозможность
создания собственных порожденных классов со свойствами
строки.
В этой лекции рассмотрим также как форматировать строки и
использовать регулярные выражения.
4. Строки
Создание строк и длина строкиКласс String поддерживает несколько конструкторов, например:
String(),
String(String str),
String(byte[] asciichar),
String(char[] unicodechar),
String(StringBuffer sbuf),
String(StringBuilder sbuild) и др.
Для нахождения длины строки используется метод length().
5. Строки
Рассмотрим разные вариантысоздания строк:
6. Строки
В следующем примерепоказано, как создавать строки
из массива типа byte:
7. Строки
Для сравнения строкиспользуются методы equals() и
equalsIgnoreCase(), который не
учитывает регистр символов:
8. Строки
В Java существует так называемыйString Pool, в котором хранятся
созданные строки. При создании
очередной строки, JVM сначала
ищет такую строку в String Pool.
Если такая строка уже есть, то она
возвращается вместо создания
новой.
String Pool не используется, если
строка создается с помощью
конструктора. В этом случае
гарантированно создается новый
объект:
9. Строки
Следующий примердемонстрирует сравнение
строк с помощью == и метода
equals():
10. Строки
Сравнение подстрокВ классе String реализована группа методов, сравнивающих
часть строки с подстрокой:
Метод regionMatches() используется для сравнения подстроки в
исходной строке с подстрокой в строке-параметре.
Метод startsWith() проверяет, начинается ли данная подстрока
фрагментом, переданным методу в качестве параметра.
Метод endsWith() проверяет совпадает ли с параметром конец
строки.
Метод contains() проверяет входит ли подстрока в строку.
11. Строки
Сравнение подстрок12. Строки
Метод compareTo()Зачастую бывает недостаточно просто знать, являются ли две
строки идентичными. Для приложений, в которых требуется
сортировка, нужно знать, какая из двух строк меньше другой. Для
ответа на этот вопрос нужно воспользоваться методом
compareTo(str) класса String.
Если результат метода меньше нуля - вызывающая строка
меньше str. Больше нуля - вызывающая строка больше str. Ноль две строки эквивалентны.
13. Строки
Следующий примерпоказывает сортировку
строкового массива с
помощью пузырька:
14. Строки
Вывод:15. Строки
Извлечение символов осуществляется с помощью метода charAt()класса String:
16. Строки
В класс String включена поддержка поиска определенногосимвола или подстроки, для этого в нем имеются два метода —
indexOf() и lastIndexOf().
indexOf() - ищет первое вхождение символа или подстроки.
lastlndexOf() - ищет последнее вхождение символа или подстроки.
Каждый из этих методов возвращает индекс того символа, который
вы хотели найти, либо индекс начала искомой подстроки. В любом
случае, если поиск оказался неудачным методы возвращают
значение -1.
17. Строки
Чтобы найти первое или последнее вхождение символа,применяйте:
Здесь ch символ, который нужно искать. Чтобы найти первое или
последнее вхождение подстроки, применяйте:
18. Строки
Вы можете указать начальную позицию для поиска,воспользовавшись следующими формами:
19. Строки
Рассмотрим применение этихметодов на следующем
примере:
20. Строки
Метод concat() используетсядля объединения двух строк.
Метод replace() заменяет
один символ на другой.
Методы toLowerCase() и
toUpperCase() приводят
строку к верхнему или
нижнему регистру.
21. Строки
Если Вы имеете дело с каким-либо типом данных и хотите вывестизначение этого типа в удобочитаемом виде, сначала придется
преобразовать это значение в текстовую строку. Для этого
существует метод valueOf().
Такой статический метод определен для любого существующего в
Java типа данных. Благодаря этому не составляет труда
преобразовать в строку значение любого типа.
22. Строки
Метод substring() вырезает подстроку из строки, используяуказанные позиции. Существует два варианта этого метода. Первый
вариант вырезает от указанной позиции и до конца. Второй - от
первой позиции до второй. Символ, находящийся в первой позиции,
будет включен в результирующую строку. А последний - нет.
23. Строки
В версию JDK 8 в класс String был внедрен новый метод join(),предназначенный для соединения двух и более символьных строк,
разграничиваемых указанным разделителем, например, пробелом
или запятой:
24. Строки
Метод isEmpty() проверяет пустая ли строка. Возвращает true, толькоесли длина строки равна 0.
Метод isBlank() возвращает true, если строка пуста или содержит
только пробелы (Java 11).
25. StringBuffer и StringBuilder
Отличие между String, StringBuilder, StringBuffer1.
Классы StringBuffer и StringBuilder в Java используются, когда возникает
необходимость сделать много изменений в строке символов.
2.
В отличие от String, объекты типа StringBuffer и StringBuilder могут быть изменены
снова и снова. Класс String является immutable - Вы не можете модифицировать
объект String, но можете заменить его созданием нового экземпляра.
3.
В Java StringBuilder был введен начиная с Java 5.
4.
Основное различие между StringBuffer и StringBuilder в Java является то, что методы
StringBuilder не являются безопасными для потоков (несинхронизированные).
5.
Рекомендуется использовать StringBuilder всякий раз, когда это возможно, потому
что он быстрее, чем StringBuffer в Java.
6.
Однако, если необходима безопасность потоков, наилучшим вариантом являются
объекты StringBuffer.
26. StringBuffer и StringBuilder
Конструкторы StringBuilderStringBuilder() - объект StringBuilder можно создать без параметров, при этом в нем
будет зарезервировано место для размещения 16 символов.
StringBuilder(int size) - вы также можете передать конструктору целое число, для того
чтобы явно задать требуемый размер буфера.
StringBuilder(String str) - вы можете передать конструктору строку, при этом она будет
скопирована в объект и дополнительно к этому в нем будет зарезервировано место
еще для 16 символов.
StringBuilder(CharSequence chars) - создает строкового разработчика, который содержит
те же самые символы как указанное CharSequence.
27. StringBuffer и StringBuilder
В следующем примере создадим объект класса StringBuilder, и выведем на консоль егоразмер методом length(). Метод capacity() возвращает размер буфера:
28. StringBuffer и StringBuilder
Метод charAt() возвращает символ в указанной позиции. А setCharAt() изменяет символ вуказанной позиции:
29. StringBuffer и StringBuilder
Метод append() присоединяет подстроку к строке:30. StringBuffer и StringBuilder
Метод insert() вставляет подстроку в указанную позицию:31. StringBuffer и StringBuilder
Используется для инвертирования строки:32. StringBuffer и StringBuilder
Метод delete() удаляет подстроку, используя указанные позиции.Метод deleteCharAt() удаляет символ с указанной позиции:
33. StringBuffer и StringBuilder
Метод replace()Заменяет подстроку в указанной позиции другой:
34. StringBuffer и StringBuilder
Классы StringBuilder и StringBuffer не переопределяют методы equals() и hashCode(). Онииспользуют реализацию класса Object:
35. Форматирование строк
Базовой частью поддержки создания форматированного вывода в языке Java служит классFormatter, включенный в пакет java.util. Он обеспечивает преобразования формата (format
conversions) позволяющие выводить числа, строки и время и даты практически в любом
понравившемся вам формате.
В классе Formatter объявлен метод format(), который преобразует переданные в него
параметры в строку заданного формата и сохраняет в объекте типа Formatter.
36. Форматирование строк
Рассмотрим использование класса Formatter (где %s называется спецификаторомформата):
37. Форматирование строк
Следующий пример использует класс Formatter для отображения дробного числа:38. Форматирование строк
Метод format() классов PrintStream, PrintWriter и StringАналогичный метод format() объявлен у классов PrintStream и PrintWriter. System.out это
статическая переменная типа PrintStream.
В Java 5 для классов PrintStream и PrintWriter добавлен метод printf(). Методы printf() и
format() автоматически используют класс Formatter:
39. Форматирование строк
С помощью метода String.format() тоже возможно форматирование:40. Форматирование строк
Спецификаторы формата%a Шестнадцатеричное значение с плавающей точкой
%b Логическое (булево) значение аргумента
%c Символьное представление аргумента
%d Десятичное целое значение аргумента
%h Хэш-код аргумента
%e Экспоненциальное представление аргумента
%f Десятичное значение с плавающей точкой
%g Выбирает более короткое представление из двух: %е или %f
%o Восьмеричное целое значение аргумента
%n Вставка символа новой строки
%s Строковое представление аргумента
%t Время и дата
%x Шестнадцатеричное целое значение аргумента
%% Вставка знака %
41. Форматирование строк
Флаги формата-
Выравнивание влево
#
Изменяет формат преобразования
0
Выводит значение, дополненное нулями вместо пробелов. Применим только к
числам.
Пробел
Положительные числа предваряются пробелом
+
Положительные числа предваряются знаком +. Применим только к числам.
,
Числовые значения включают разделители групп. Применим только к числам.
(
Отрицательные числовые значения заключаются в скобки. Применим только к
числам.
42. Форматирование строк
Рассмотрим пример использования флагов:43. Форматирование строк
В строке, определяющей формат, может задаваться индекс форматируемогопараметра. Индекс должен следовать непосредственно за символом % и завершаться
знаком $:
44. Форматирование строк
Общий синтаксис можно описать так:45. Регулярные выражения
Регулярное выражение - это своего рода шаблон, который можетбыть применен к тексту. Java предоставляет пакет java.util.regex для
сопоставления с регулярными выражениями.
Регулярное выражение или соответствует тексту (его части) или нет.
Если регулярное выражение совпадает с частью текста, то мы
можем найти его. Если регулярное выражение составное, то мы
можем легко выяснить, какая часть регулярного выражения
совпадает с какой частью текста.
46. Регулярные выражения
Например, есть следующая строка:Из строки нужно вырезать все имена файлов: file1.doc, file2.txt,
file3.img, file4.doc. Для нахождения используется регулярное
выражение:
47. Регулярные выражения
Регулярное выражение [a-z]+ соответствует всем строчным буквам втексте. [a-z] означает любой символ от a до z включительно,
и + означает «один или более» символов.
Рассмотрим пример нахождения регулярного выражения в тексте:
48. Регулярные выражения
Pattern класс - объект класса составляет представление регулярного выражения.Класс Pattern не предусматривает никаких публичных конструкторов. Чтобы
создать шаблон, необходимо сначала вызвать один из публичных статических
методов, которые затем возвращают объект класса Pattern. Эти методы
принимают регулярное выражение в качестве аргумента.
Matcher класс - объект «Искатель» является двигателем, который интерпретирует
шаблон и выполняет операции сопоставления с входной строкой. Как и Pattern
класс, Matcher не имеет публичных конструкторов. Вы получаете объект Matcher
вызовом метода matcher(), на объекте класса Pattern.
Методы класса Matcher:
matches() возвращает true, если шаблон соответствует всей строке, иначе false.
lookingAt() возвращает true, если шаблон соответствует началу строки, и false в
противном случае.
find() возвращает true, если шаблон совпадает с любой частью текста.
49. Регулярные выражения
Основные метасимволы^
$
(крышка) начало проверяемой строки
(доллар) конец проверяемой строки
.
(точка) представляет собой сокращенную форму записи для символьного класса, совпадающего с любым
символом
|
?
+
*
означает «или». Подвыражения, объединенные этим способом, называются альтернативами (alternatives)
(знак вопроса) означает, что предшествующий ему символ является необязательным
обозначает «один или несколько экземпляров непосредственно предшествующего элемента
любое количество экземпляров элемента (в том числе и нулевое)
\\d
цифровой символ
\\D
не цифровой символ
\\s
пробельный символ
\\S
не пробельный символ
\\w
буквенный(латиница) или цифровой символ или знак подчёркивания
\\W
любой символ, кроме буквенного или цифрового символа или знака подчёркивания
[abc]
Диапазон символов или цифр
50. Регулярные выражения
Примеры регулярных выражений:51. Регулярные выражения
Сравнение регулярного выражения с текстом52. Регулярные выражения
Простой валидатор ссылки53. Регулярные выражения
Регулярное выражение для проверки email54. Регулярные выражения
Класс Pattern содержит метод split(), который разбивает строку на подстроки,используя указанный в шаблоне разделитель:
55. Регулярные выражения
Класс String определяет такой же метод split():56. Локализация и интернационализация
Интернационализация (i18n) - это процесс разработки приложения такойструктуры, при которой дополнение нового языка не требует перестройки и
перекомпиляции (сборки) всего приложения. Достигается это за счет отдельного
хранения данных интернационализации в виде файлов свойств, загружаемых
приложением динамически в процессе работы.
Локализация (l10n) – это адаптация приложения к конкретному языку и региону
путем перевода выводимых пользователю текстовых элементов и документации, а
также определения данных времени, валют и др., согласно специфике данного
региона.
57. Локализация и интернационализация
Класс Java java.util.Locale позволяет учесть особенности региональных представленийалфавита, символов, чисел и дат. Автоматически виртуальная машина использует текущие
региональные установки операционной системы, но при необходимости их можно изменять.
Для некоторых стран региональные параметры устанавливаются с помощью констант,
например: Locale.US, Locale.FRANCE.
Для всех остальных объект класса Locale нужно создавать с помощью конструктора, например:
Locale rus = new Locale("ru", "RU");
Существует константа Locale.ROOT. Она представляет локаль, для которой язык, страна равны
пустой строке(""). Эта локаль является базовой для всех остальных локалей. Используется для
написания приложений, не зависящих от локали.
Определить текущий вариант региональных параметров можно следующим образом: Locale
current = Locale.getDefault();
А можно и изменить для текущего экземпляра (instance) JVM: Locale.setDefault(Locale.CANADA)
58. Локализация и интернационализация
Рассмотрим пример использованиякласса Locale
59. Локализация и интернационализация
Класс ResourceBundle вместе с классом Locale лежит в основе процессаинтернационализации в языке Java.
Класс ResourceBundle предназначен для чтения данных из текстовых файлов свойств
(расширение - properties). Каждый отдельный файл с расширением properties содержит
информацию для отдельной локали.
В файлах свойств (*.properties) информация должна быть организована по принципу:
60. Локализация и интернационализация
Например:или
61. Локализация и интернационализация
Рассмотрим правила выбора имени для properties файлов. Выбираем базовое имя длягруппы properties файлов. Например text. Добавляем к базовому имени через пробел код
языка (ru) и код страны (RU).
Следующий список показывает возможный набор соответствующих ресурсов с базовым
именем:
text.properties
text_ru_RU.properties
text_fr_CA.properties
Чтобы выбрать определенный объект ResourceBundle, следует вызвать один из статических
перегруженных методов getBundle(параметры).
62. Локализация и интернационализация
Следующий фрагмент выбирает text объекта ResourceBundle для объекта Locale, которыйсоответствует французскому языку и стране Канада:
Если объект ResourceBundle для заданного объекта Locale не существует, то метод
getBundle() извлечет наиболее общий.
Если общее определение файла ресурсов не задано, то метод getBundle() генерирует
исключительную ситуацию MissingResourceException. Чтобы это не произошло,
необходимо обеспечить наличие базового файла ресурсов без суффиксов, а именно:
text.properties в дополнение к частным случаям вида:
text_en_US.properties
text_ru_RU.properties.
63. Локализация и интернационализация
Пусть базовое имя ресурса baseName, и ресурс нам нужен для fr, CA. Locale поумолчанию определена через ru, RU. Мы вызываем ResourceBundle.getBundle(baseName,
canadaLocale). В каком порядке будет организован поиск в properties файлах?
Формируется следующий список строк (так называемые кандидаты в имена пакетов):
baseName + "_"+ fr + "_" + CA
baseName + "_"+ fr
baseName + "_"+ ru + "_" + RU
baseName + "_"+ ru
baseName
64. Локализация и интернационализация
Рассмотрим пример использованиякласса ResourceBundle:
65. Локализация и интернационализация
В классе ResourceBundle определен ряд полезных методов:getKeys() - возвращает объект Enumeration, который применяется для
последовательного обращения к элементам.
keySet() – возвращает множество Set всех ключей.
getString(String key) - извлекается конкретное значение по конкретному ключу.
boolean containsKey(String key) - проверить наличие ключа в файле.
66. Локализация и интернационализация
В следующем примереиспользуется метод keySet()
класса ResourceBundle:
67. Локализация и интернационализация
Класс NumberFormat языка Java используется для форматирования чисел.Чтобы получить объект класса для форматирования в национальном стандарте
по умолчанию, используются следующие методы:
NumberFormat.getlnstance()
NumberFormat.getNumberlnstance() - идентичен getInstance()
NumberFormat.getCurrencylnstance()
NumberFormat.getPercentlnstance()
68. Локализация и интернационализация
Чтобы получить объект класса для форматирования в других национальныхстандартах используются следующие методы:
NumberFormat.getlnstance(Locale locale)
NumberFormat.getNumberlnstance(Locale locale) - идентичен getInstance(Locale
locale)
NumberFormat.getCurrencylnstance(Locale locale)
NumberFormat.getPercentlnstance(Locale locale)
69. Локализация и интернационализация
Рассмотрим примериспользования класса
NumberFormat:
70. Локализация и интернационализация
Другие полезные методы NumberFormat класса:setMaximumFractionDigits(int digits) - устанавливает максимальное количество
цифр после десятичной точки в форматируемом объекте. Последняя
отображаемая цифра округляется.
setMaximumlntegerDigits(int digits) - устанавливает максимальное количество
цифр перед десятичной точкой в форматируемом объекте. Используйте этот
метод с предельной осторожностью. Если вы зададите слишком мало цифр,
число будет просто усечено, и результат станет совершенно неправильным!
setMinimumFractionDigits(int digits) - устанавливает минимальное количество
цифр после десятичной точки в форматируемом объекте. Если количество
цифр в дробной части числа меньше минимального, то на экран выводятся
замыкающие нули.
71. Локализация и интернационализация
setMinimumlntegerDigits(int digits) - устанавливает минимальное количество цифрперед десятичной точкой в форматируемом объекте. Если количество цифр в
целой части числа меньше минимального, то на экран выводятся ведущие нули.
getMaximumFractionDigits() - возвращает максимальное количество цифр после
десятичной точки в форматируемом объекте.
getMinimumFractionDigits() - возвращает минимальное количество цифр после
десятичной точки в форматируемом объекте.
72. Локализация и интернационализация
Рассмотрим примериспользования методов
setMaximumFractionDigits(int digits),
getMaximumFractionDigits(),
setMaximumlntegerDigits(int digits):
73. Локализация и интернационализация
Следующий примердемонстрирует использование
методов getMinimumFractionDigits(),
setMinimumlntegerDigits(int digits),
setMinimumFractionDigits(int digits)
класса NumberFormat:
74. Локализация и интернационализация
Метод parse() классаNumberFormat преобразует строку
к числу. Если перед вызовом
метода parse() вызвать метод
setParseIntegerOnly(true), как
показано в следующем примере,
то преобразовываться будет только
целая часть числа.