Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница82 из 90
1   ...   78   79   80   81   82   83   84   85   ...   90
ГЛАВА
Регулярные
выражения
* *
'
' - и другие пакеты
Изначально язык Java включал восемь пакетов, называемых API ядра (core API). С каждым последующим выпуском API пополнялся новыми пакетами. На сегодняшний день API Java содержит большое количество пакетов. Многие из них являются специализированными и не рассматриваются в этой книге. Тем не менее четыре пакета мы все же рассмотрим — j a v a . u t i l . r e g e x , j a v a . 1 a ng . r e f l e c t , j a v a . r mi и j a v a . t e x t . Эти пакеты поддерживают обработку регулярных выражений, рефлексию, дистанционный вызов методов и обработку текстов.
Пакет регулярных выражений позволит выполнять сложные операции сопоставления с шаблонами. В этой главе дан углубленный анализ этого пакета и предложены многочисленные его примеры. Рефлексией называется способность программного обеспечения к самоанализу.
Рефлексия является неотъемлемой частью технологии Java Bean, которая рассматривается в главе 29. Дистанционный вызов методов (Remote M ethod Invocation —
RMI) позволяет создавать приложения Java, которые будут распределяться среди нескольких компьютеров. В этой главе будет предложен один простой клиент- серверный пример, в котором используется RMI. Возможности форматирования текста, предлагаемые пакетом j a v a . t e x t , имеют самое широкое применение. В этой главе будут рассмотрены примеры форматирования строк даты и времени.
Пакеты API ядра
В табл. 28.1 приведен список всех пакетов API ядра (в пространстве имен j ava) с указанием их назначения.
Таблица 28.1. Пакеты API ядра
Пакет
Основное назначение j a v a . a p p l e Поддерживает процесс создания аплетов j a v a . Предоставляет возможности графических пользовательских интерфейсов j a v a . a w t. c o l o Поддерживает цветовые пространства и профили j a v a . a w t. d a t a t r a n s f e Передает данные в системный буфер обмена и обратно j a v a . a w t. Поддерживает операции перетаскивания j a v a . a w t. e v e n Обрабатывает события j a v a . a w t. fo n Представляет различные типы шрифтов j a v a . a w t. Позволяет работать с геометрическими формами

9 1 Часть II. Библиотека Продолжение табл. 28.1

Пакет
Основное назначение a v a .a w t .im
j a v a .a w t .im.spi
j a v a .a w t .image
j a v a .a w t .i m a g e .render-
able
j a v a .awt.print
j a v a .beans
j a v a .b e a n s .beancontext
j a v a .io
j a v a .lang
j a v a .l a n g .annotation
j a v a .l a n g .instrument
j a v a .l a n g .invoke
j a v a .l a n g .management
java.lang.ref
j a v a .l a n g .reflect
j ava.math
j a v a .net
j a v a .nio
j a v a .n i o .channels
j a v a .n i o .c h a n n e l s .spi
j a v a .n i o .charset
j a v a .n i o .c h a r s e t .spi
j a v a .nio.file
j a va.nio.file.attri­
bute
j a v a .n i o .f i l e .spi
j a v a .rmi
j a v a .r m i .activation
j a v a .r m i .dgc
j a v a .r m i .registry
j a v a .r m i .server
j a v a .security
j a v a .s e c u r i t y .acl
j a v a .s e c u r i t y .cert
j a v a .s e c u r i t y Позволяет вводить японские, китайские и корейские символы в компоненты редактирования текста Поддерживает альтернативные устройства ввода Обрабатывает изображения
Поддерживает изображения с независимой визуализацией
Поддерживает общие свойства печати
Позволяет создавать компоненты программного обеспече­
ния
Обеспечивает среду выполнения для компонентов Java Вводит и выводит данные
Обеспечивает базовые функциональные возможности Поддерживает аннотации (метаданные)
Поддерживает инструментальные средства для программ Поддерживает динамические языки Поддерживает управление средой выполнения Позволяет взаимодействовать со сборщиком мусора Анализирует код вовремя выполнения Обрабатывает большие целые и десятичные числа Поддерживает работу в сети
Пакет верхнего уровня для классов NIO. Инкапсулирует буферы
Инкапсулирует каналы, используемые в системе NIO Поддерживает провайдеры служб для каналов
Инкапсулирует наборы символов
Поддерживает провайдеры служб для наборов символов Обеспечивает поддержку NIO для файлов Поддерживает файловые атрибуты Поддерживает провайдеры служб NIO для файлов Обеспечивает дистанционный вызов методов Активизирует постоянные объекты Управляет распределенным сбором “мусора”
Отображает имена как ссылки на дистанционные объекты Поддерживает дистанционный вызов методов
Обрабатывает сертификаты, ключи, дайджесты, подписи и другие функции, связанные с безопасностью Поддерживает списки управления доступом
Выполняет синтаксический анализ и управление сертифи­
катами
Определяет интерфейсы для ключей DSA (Digital Signature
Algorithm — алгоритм цифровой подписи
Глава 28. Регулярные выражения и другие пакеты 1 9
Ife tft?
; , Основное назначение a v a .s e c u r i t y Определяет параметры ключей и алгоритмов a v a Взаимодействует с базой данных SQL (Structured Query
Language — язык структурированных запросов Форматирует, производит поиски манипулирует текстом a v a .t e x t Поддерживает провайдеры служб для классов форматирования текста в
J a v a .
Содержит общие утилиты a v a .u t i l Поддерживает параллельные утилиты a v a .u t i l .c o n c u r r e n t Поддерживает атомарные (те. неделимые) операции вот ношении переменных без использования блокировок a v a .u t i l .c o n c u r r e n t Поддерживает синхронизационные блокировки a v a . u t i l Создает и считывает файлы JAR
j a v a .u t i l Поддерживает регистрацию информации, связанной с выполнением программы
java.util.prefs
Инкапсулирует информацию, связанную с предпочтениями пользователя a v a . u t i l Поддерживает обработку регулярных выражений a v a .u t i l Поддерживает провайдеры служб вспомогательных классов в пакете
j ava .util
j a v a . u t i l Считывает и записывает упакованные и распакованные файлы Обработка регулярных выражений
Пакет java.util.
regex поддерживает обработку регулярных выражений. Используемый здесь термин регулярное выражение (regular expression) относится к строке символов, описывающей последовательность символов. Это общее описание, называемое шаблоном, впоследствии может использоваться для поиска совпадений в других последовательностях символов. Регулярные выражения могут определять групповые символы, наборы символов и разнообразные квантифика­
торы. Таким образом, вы можете задать регулярное выражение, представляющее общую форму, которая может совпадать с несколькими различными специфическими последовательностями символов.
Существует два класса, поддерживающих обработку регулярных выражений, —
Pattern и
Matcher. Эти классы работают вместе. Класс
Pattern применяется для задания регулярного выражения. Сопоставление шаблона с последовательностью символов реализуется с помощью класса Класс

P a t t e r В классе
Pattern нет определений конструкторов. Наоборот, шаблон формируется с помощью вызова фабричного метода compile ()
. Одна из форм этого метода показана далее Pattern compile(String шаблон

9 2 Часть II. Библиотека Здесь шаблон представляет регулярное выражение, которое вы хотите использовать. Метод compile
() преобразует строку шаблон в шаблон, который можно использовать для сопоставления, осуществляемого с помощью класса
Matcher. Этот метод возвращает объект класса
Pattern, содержащий данный шаблон.
После того как создадите объект класса
Pattern, будете использовать его для создания объекта класса
Matcher. Для этого вызывается фабричный метод matcher ()
, определяемый классом
Pattern.
Matcher matcher(CharSequence
строка
)
Здесь строка — это последовательность символов, которая будет сопоставляться с шаблоном. Она называется входной последовательностью. Интерфейс
CharSequence определяет набор символов только для чтения. Помимо всего прочего, он реализуется классом
String. Таким образом, вы передаете строку методу matcher (Класс

M a t c h e Этот класс не имеет конструкторов. Наоборот, вы создаете объект класса
Matcher при помощи вызова фабричного метода matcher ()
, определяемого в классе
Pattern, о чем мы уже говорили. После того как создадите объект класса
Matcher, выбудете использовать его методы для выполнения различных операций по сопоставлению с шаблонами.
Самым простым методом сопоставления с шаблоном является метод match­
es
(), который просто определяет, совпадает ли последовательность символов с шаблоном. Этот метод показан ниже Он возвращает значение true, если последовательность и шаблон совпадают, в противном случае он возвращает значение false. Следует иметь ввиду, что с шаблоном должна совпадать не вся последовательность, а только ее часть (подпоследовательность) Чтобы определить, совпадает ли подпоследовательность с входящей последовательностью, используется метод f ind ()
. Ниже показана одна из его версий Этот метод возвращает значение true, если имеет место совпадение, в противном случае он возвращает значение false. Метод можно вызывать неоднократно и находить все совпадающие подпоследовательности. При каждом вызове метода find
() сравнение начинается с того места, где было закончено предыдущее.
Строку, содержащую последнюю совпавшую последовательность, можно получить с помощью метода group ()
. Одна из его форм показана ниже g r o u p (Метод возвращает совпавшую строку. Если совпадение не было обнаружено, передается исключение С помощью метода start
() можно получить индекс внутри входной последовательности текущего совпадения. Индекс, следующий за окончанием текущего совпадения, можно получить с помощью метода end ()
. Эти методы показаны ниже start()

int e n d (Каждый из них в случае отсутствия совпадения передает исключение
IllegalStateException.
Каждую совпавшую последовательность можно заменить другой последовательностью, если вызвать метод replace
All ().
String replaceAll(String
новСтр)
Глава 28. Регулярные выражения и другие пакеты 2 Здесь параметр новСтр определяет новую последовательность символов, которая заменит последовательности, совпавшие с шаблоном. Обновленная входная последовательность будет возвращена в качестве строки.
Синтаксис регулярного выражения
Прежде чем продемонстрировать работу классов P a t t e r n и M a t c h e r , необходимо объяснить, как формируется регулярное выражение. Хотя ни одно из правил не является сложным, их существует большое количество, и полностью описать правила в этой книге невозможно. Однако здесь вы найдете несколько наиболее распространенных конструкций.
В общем случае регулярное выражение состоит из обычных символов, классов символов (наборов символов, групповых символов и квантификаторов. Обычный символ сопоставляется по принципу как есть. Таким образом, если шаблон содержит пару символов " х у ", то единственной входящей последовательностью, которая может совпасть с этим шаблоном, является " х у ". Символы вроде новой строки и табуляции определяются при помощи стандартных управляющих последовательностей, которые начинаются со слеша (\). Например, символ новой строки определяется последовательностью п . В языке регулярных выражений обычный символ называется также литералом.
Класс символов является набором символов. Класс символов можно задать, заключив символы класса в квадратные скобки. Например, класс [wxyz] совпадает с w, х, у или z. Чтобы задать обратный (инвертированный) набор, перед символами необходимо поставить знак ч. Например, класс [^wxyz] совпадает с любым символом, за исключением w, х, у или z. С помощью дефиса указывается диапазон символов. Например, чтобы задать класс символов, которые будут совпадать с цифрами от 1 до 9, используется запись [ 1 - 9 Групповым символом является символ точки ( . ), который совпадает с любым символом вообще. Таким образом, шаблон, состоящий из " . 11, будет совпадать с любой из следующих (и любыми другими) входящих последовательностей " А,
" ахи т.д.
Квантификатор определяет, сколько раз совпадает выражение. В табл. 28.2 представлены возможные квантификаторы.
Таблица 28.2. Квантификаторы, применяемые в регулярных выражениях+ Совпадает один или более раз Совпадает нуль или более раз Совпадает нуль или один раз
Например, шаблон "х" будет совпадать с "х, "хх", "ххх" и т.п.
И еще одно вообще, если вы определите неверное выражение, будет создано исключение Рае Пример совпадения с шаблоном

Чтобы лучше понять, как осуществляется сопоставление с шаблоном в регулярном выражении, давайте рассмотрим несколько примеров. В первом из них, показанном далее, производится поиск совпадения с литеральным шаблоном

9 2 Часть II. Библиотека Java
// Пример простого сопоставления с шаблоном
import java.util.regex.*;
class RegExpr {
public static void main(String a r g s []) {
Pattern pat;
Matcher mat;
boolean found;
pat = Pattern.compile("Java");
mat = pat.matcher("Java");
found = mat.matches(); // поиск совпадения
System.out.println("Проверка совпадения Java с Java.");
i f (found) Совпадает
else System.out.println("He совпадает");
System.out.println();
System.out.println("Проверка совпадения Java с Java 7.");
mat = pat.matcher("Java 7"); // создание нового обнаружителя
// совпадений = mat.matches(); // поиск совпадения f (found) Совпадает
else System.out.println("He совпадает");
}
}
Ниже представлены результаты выполнения этой программы.
Проверка совпадения Java с Java.
Совпадает
Проверка совпадения Java с Java Не совпадает
Давайте проанализируем эту программу. Она начинается с создания шаблона, состоящего из последовательности " J a v a ". После этого для данного шаблона создается объект класса M a t c h e r с входящей последовательностью " J a v a " . Затем вызывается метод m a t c h e s (), с помощью которого определяется, совпадает ли входящая последовательность с шаблоном. Так как последовательность и шаблон одинаковые, метод m a t c h e s () возвращает значение t r u e . Затем создается новый объект класса M a t c h e r с входящей последовательностью " J a v a 7 " и опять вызывается метод m a t c h e s (). В этом случае шаблон и входящая последовательность отличаются друг от друга, поэтому совпадение не обнаруживается. Помните, что метод m a t c h e s () возвращает значение t r u e только в том случае, когда входящая последовательность в точности совпадает с шаблоном. Он не возвращает значение t r u e просто потому, что подпоследовательность не совпадает с шаблоном.
Чтобы определить, содержит ли входная последовательность подпоследовательность, совпадающую с шаблоном, можно вызвать метод f i n d (). Рассмотрим следующую программу Использование метода find() для нахождения подпоследовательности
import java.util.regex.*;
class RegExpr2 {
public static void main(String a r g s []) {
Pattern pat = Pattern.compile("Java");
Matcher mat = pat.matcher("Java 7");
Глава 28. Регулярные выражения и другие пакеты 2 Поиск Java в Java 7.");
if(mat.fi n d ()) System.out.println("Подпоследовательность
найдена");
else Совпадений нет");
}
}
Ниже показаны результаты выполнения этой программы.
Поиск Java в Java Подпоследовательность найдена
В данном случае метод f i n d () ищет подпоследовательность " J a v a "Метод f i n d ( ) можно использовать для поиска во входящей последовательности повторяющихся совпадений с шаблоном, поскольку каждый вызов метода f i n d () начинается с того места, где был завершен предыдущий. Например, следующая программа находит два случая совпадения с шаблоном " t e s t ".
// Использование метода find() для нахождения нескольких
// подпоследовательностей
import java.util.regex.*;
class RegExpr3 {
public static void main(String a r g s []) {
Pattern pat = Pattern.compile("test");
Matcher mat = pat.matcher("test 1 2 3 test");
while(mat.fi n d ()) {
System.out.println("test найдена по индексу " + m a t Ниже представлены результаты выполнения этой программы найдена по индексу О
test найдена по индексу Как можно видеть из этих результатов, было найдено два случая совпадения. Программа использует метод s t a r t () для получения индекса каждого совпадения.
И спользование групповых символов и квантиф икаторов
В предыдущей программе была показана общая технология использования классов P a t t e r n и M a t c h e r , но она не раскрывает полностью их возможности. Реальное преимущество обработки регулярных выражений оценить невозможно, не используя групповые символы и квантификаторы. Для начала рассмотрим следующий пример, в котором квантификатор + используется для сопоставления любой произвольной последовательности символов W.
// Использование квантификатора,
import java.u t i l .regex.*;
class RegExpr4 {
public static void main(String a r g s []) {
Pattern pat = Pattern.compile("W+");
Matcher mat = pat.matcher("W WW WWW");
while(mat.fin d (Совпадение " + m a t .g r o u p ());

9 2 Часть II. Библиотека Ниже представлены результаты выполнения этой программы.
Совпадение: W Совпадение WW
Совпадение Как можно видеть из результатов, комбинация "W+" в регулярном выражении совпадает с последовательностью символов W какой угодно длины.
В следующей программе групповой символ используется для формирования шаблона, который будет сопоставляться с любой последовательностью, начинающейся се и заканчивающейся d. Для этого в ней используется групповой символ точки и квантификатор +.
// Использование группового символа и квантификатора,
1   ...   78   79   80   81   82   83   84   85   ...   90


написать администратору сайта