ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.07.2019
Просмотров: 189
Скачиваний: 1
Федеральное агентство связи
Федеральное государственное бюджетное образовательное
учреждение высшего образования
Поволжский государственный университет
телекоммуникаций и информатики
Кафедра Информационных систем и технологий
Лабораторная работа №7
По дисциплине «Инструментальные средства информационных систем»
«Использование регулярных выражений в java-приложениях»
Руководитель доцент к. т. н.
__________________ Никитин К.А.
Самара 2018
1 задание. Используя пример из раздела 7 создать программу, которая выполняет поиск символов «abcdef12345» в вводимой из консоли строки текста.
import
java.util.regex.*;//библиотека
для использования Pattern и Matcher
import
java.util.Scanner;
public
class Main
{
public
static void main(String[]
args) {
Scanner sc =new
Scanner(System.in);//создание
экземпляра класса сканер
String
s1=sc.nextLine();//
считывать строку до перевода строки
Pattern
p1 = Pattern.compile("[abcdef]|[12345]");//
Pattern compile(String regex) – возвращает Pattern,
который соответствует regex.
Matcher
matcher = p1.matcher(s1);//Matcher
matcher(CharSequence input) – возвращает Matcher, с
помощью которого можно находить
соответствия в строке
while
(matcher.find())
{
System.out.println("Найдено
"+matcher.group()+"
индекс "+matcher.end());
}
}
}
Выполнение:
2 задание.
5 |
Определить является ли вводимая строка датой в формате dd/mm/yyyy. |
import
java.util.Scanner;
public
class Main
{
public
static void main(String[]
args) {
Scanner sc =new
Scanner(System.in);//создание
экземпляра класса сканер
String
s1=sc.nextLine();//
считывать строку до перевода строки
String
pattern =
"(([012]\\d|3[01])/(0[13578]|1[02])/(1[6-9]\\d{2}|[2-9]\\d{3}))|(([012]\\d|3[0])/(0[469]|11)/(1[6-9]\\d{2}|[2-9]\\d{3}))|(([01]\\d|2[0-8])/02/(1[6-9]\\d{2}|[2-9]\\d{3}))";
boolean
x=s1.matches(pattern);//Метод
matches() проверяет строку на соответствие
регулярному выражению
if(x==true){
System.out.print("Дата
верна");
}
else{
System.out.print("Такой
даты не существует");
}
/*
\d
[0-9] Цифра от 0 до 9
X|Y X либо Y
X{n}
X n раз
*/
}
}
Выполнение:
3 задание.
5 |
Из многострочного текста со списком цен извлечь и отдельно вывести цены в USD, RUS, EU. (Пример: 23.78 USD.) |
Код:
import
java.util.regex.*;
import
java.util.Scanner;
public
class Main
{
public
static void main(String[]
args) {
//
проверка строки на соответствие шаблону
String
regexUS = "(\\W|^)(\\d+\\.)(\\w{1,2}\\s)USD(\\W|$)";
String regexRU = "(\\W|^)(\\d+\\.)(\\w{1,2}\\s)RUS(\\W|$)";
String regexEU = "(\\W|^)(\\d+\\.)(\\w{1,2}\\s)EU(\\W|$)";
String s;
Scanner g = new
Scanner(System.in);//
экземпляр класса сканер
s
= g.nextLine();//
считывать до энтера
Pattern
p1 = Pattern.compile(regexUS);//возвращает
Pattern, который соответствует regex
Pattern
p2 = Pattern.compile(regexRU);
Pattern p3 = Pattern.compile(regexEU);
Matcher m1 = p1.matcher(s);//Метод
matches() проверяет строку на соответствие
регулярному выражению
Matcher
m2 = p2.matcher(s);
Matcher m3 = p3.matcher(s);
System.out.println("Список
цен в долларах: ");
while
(m1.find())
{
System.out.println(m1.group());
}
System.out.println("Список
цен в рублях: ");
while
(m2.find())
{
System.out.println(m2.group());
}
System.out.println("Список
цен в евро: ");
while
(m3.find())
{
System.out.println(m3.group());
}
}
}
/*
\W
Не символ слова
\d Цифра от 0 до 9
X+
X один или более раз
^ соответствует
началу новой строки. Этот элемент
позволяет искать с помощью регулярного
выражения фразы, которые находятся в
начале строки и перед которыми отсутствуют
символы.
$ соответствует окончанию
строки. Этот элемент позволяет искать
с помощью регулярного выражения фразы,
которые находятся в конце строки и после
которых отсутствуют символы.
X{n} X n
раз
*/
Выполнение:
Общие сведения
Регулярные выражения – эта система обработки текста, основанная на специальной системе записи образцов для поиска. Образец (pattern) задаёт правило поиска. Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Язык программирования Java также поддерживает регулярные выражения для работы со строками.
Основными классами для работы с регулярными выражениями являются классы Pattern и Matcher. Эти классы входят в родительский класс java.util.regex, поэтому он должен быть предварительно импортирован в код программы.
Класс Pattern применяется для определения регулярных выражений, для которого ищется соответствие в строке, файле или другом объекте, представляющем собой некоторую последовательность символов. Для определения шаблона применяются специальные синтаксические конструкции. О каждом соответствии можно получить больше информации с помощью класса Matcher. Если в строке, проверяемой на соответствие, необходимо, чтобы в какой-либо позиции находился один из символов некоторого символьного набора (шаблон), то такой набор можно объявить, используя одну из конструкций, представленных в таблице 7.1.
Общий формат класс Pattern выглядит следующим образом:
Pattern <имя переменной> = <метод класса>(“<шаблон поиска>”);
Таблица 7.1 – Способы определения шаблонов символов
Пример конструкции поиска |
Описание конструкции поиска |
[abc] |
поиск символов a, b или c |
[^abc] |
поиск любых символов кроме a, b и c |
[a-z] |
поиск любых символов в диапазоне от a до z |
[a-d[m-p]] |
поиск любых символов между a и d, а также между m и p |
[e-z&&[em]] |
поиск любых символов в диапазоне от e до z, включая символы е и m |
Кроме стандартных шаблонов символов существуют предопределенные шаблоны символов (таблица 7.2)
Таблица 7.2 – Дополнительные способы определения
шаблонов символов
Ключи |
Эквивалентная форма записи |
Описание ключа |
\d |
[0-9] |
Цифра от 0 до 9 |
\D |
[^0-9] |
Не цифра |
\s |
[\t\n\x0B\f\r] |
Символ пробела |
\S |
[^ \s] |
Не пробельный символ |
\w |
[a-zA-Z_0-9] |
Символ слова/идентификатора |
\W |
[^\w] |
Не символ слова |
. |
|
любой символ |
Способы задания границ поиска в строке указаны в таблице 7.3.
Таблица 7.3 – Способы задания границ поиска
Ключи |
Описание ключа |
^ |
начало строки; |
$ |
конец строки. Если необходимо интерпретировать \n как разделитель строк, шаблон должен быть обозначен как многострочный. Для однострочных шаблонов, аналогично концу ввода; |
\b |
граница слова; |
\B |
не граница слова; |
\A |
начало ввода; |
\G |
конец предыдущего соответствия. Так поиск по шаблону \Ga по строке aabaa выдаст результат на символ b; |
\Z |
конец ввода для последнего разделителя, если такой есть; |
\z |
конец ввода; |
При создании регулярного выражения могут использоваться логические операции (таблица 7.4).
Таблица 7.4 – Способы задания логических операций
XY |
После X следует Y |
X|Y |
X либо Y |
(X) |
X |
Скобки, кроме их логического назначения, также используются для выделения групп. Для определения регулярных выражений недостаточно одних шаблонов символов, т. к. в шаблоне часто нужно указать количество повторений. Для этого существуют квантификаторы (табл.5).
Квантификатор после символа, символьного шаблона или группы определяет, сколько раз предшествующее выражение может встречаться. Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный шаблон или группа.
Таблица 5 – Квантификаторы
X? |
X один раз или ни разу |
X* |
X ноль или более раз |
X+ |
X один или более раз |
X{n} |
X n раз |
X{n,} |
X n или более раз |
X{n,m} |
X от n до m |
Существует еще два типа квантификаторов, которые образованы прибавлением суффикса ? (слабое или неполное совпадение) или + («жадное» или собственное совпадение) к вышеперечисленным квантификаторам. Неполное совпадение соответствует выбору с наименее возможным количеством символов, а собственное – с максимально возможным.
Класс Pattern
Класс Pattern используется для простой обработки строк. Для более сложной обработки строк используется класс Matcher, рассматриваемый ниже.
В классе Pattern объявлены следующие методы:
-
compile(String regex) – возвращает Pattern, который соответствует regex;
-
matcher(CharSequence input) – возвращает Matcher, с помощью которого можно находить соответствия в строке input;
-
matches(String regex, CharSequence input) – проверяет на соответствие строки input шаблону regex;
-
pattern() – возвращает строку, соответствующую шаблону;
-
split(CharSequence input) – разбивает строку input, учитывая, что разделителем является шаблон;
-
split(CharSequence input, int limit) – разбивает строку input на не более чем limit частей.
С помощью метода matches() класса Pattern можно проверять на соответствие шаблону целой строки, но если необходимо найти соответствия внутри строки, например, определять участки, которые соответствуют шаблону, то класс Pattern не может быть использован. Для таких операций необходимо использовать класс Matcher.
Класс Matcher
С помощью данного класса производится операция сравнения. Попытка вызвать какой-либо метод класса для извлечения информации о найденном соответствии приведет к возникновению ошибки IllegalStateException. Для того чтобы начать работу с объектом Matcher нужно вызвать один из его методов:
-
matches() – проверяет, соответствует ли вся строка шаблону;
-
lookingAt() – пытается найти последовательность символов, начинающуюся с начала строки и соответствующую шаблону;
-
find() или find(int start) – пытается найти последовательность символов, соответствующих шаблону, в любом месте строки. Параметр start указывает на начальную позицию поиска.
Когда необходимо сбросить состояние объекта класса Matcher в исходное, то применяется метод reset() или reset(CharSequence input), который также устанавливает новую последовательность символов для поиска.
Для замены всех подпоследовательностей символов, удовлетворяющих шаблону, на заданную строку можно применить метод replaceAll(String replacement).
Для того чтобы ограничить поиск границами входной последовательности применяется метод region(int start, int end), а для получения значения этих границ – regionEnd() и regionStart(). С регионами связано несколько методов:
-
useAnchoringBounds(boolean b) – если установлен в true, то начало и конец региона соответствуют символам ^ и $ соответственно;
-
hasAnchoringBounds() – проверяет закрепленность границ.
В регулярном выражении для более удобной обработки входной последовательности применяются группы, которые помогают выделить части найденной подпоследовательности. В шаблоне они обозначаются скобками «(» и «)». Номера групп начинаются с единицы. Нулевая группа совпадает со всей найденной подпоследовательностью. Далее приведены методы для извлечения информации о группах:
-
end() – возвращает индекс последнего символа подпоследовательности, удовлетворяющей шаблону;
-
end(int group) – возвращает индекс последнего символа указанной группы;
-
group() – возвращает всю подпоследовательность, удовлетворяющую шаблону;
-
group(int group) – возвращает конкретную группу;
-
groupCount() – возвращает количество групп;
-
start() – возвращает индекс первого символа подпоследовательности, удовлетворяющей шаблону;
-
start(int group) – возвращает индекс первого символа указанной группы;
-
hitEnd() – возвращает истину, если был достигнут конец входной последовательности.
В классе Matcher объявлены два полезных метода для замены найденных подпоследовательностей во входной строке.
Matcher appendReplacement(StringBuffer sb, String replacement) – метод читает символы из входной стоки и добавляет их в sb. Чтение останавливается на start() – 1 позиции предыдущего совпадения, после чего происходит добавление в sb строки replacement. При следующем вызове этого метода, производится добавление символов, начиная с символа с индексом end() предыдущего совпадения.
Класс Scanner
Для ввода данных используется класс Scanner из библиотеки пакетов Java.
Этот класс необходимо импортировать в той программе, где он будет использоваться. Это делается до начала открытого класса в коде программы.
В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа.
Для работы с потоком ввода необходимо создать объект класса Scanner, при создании указав, с каким потоком ввода он будет связан. Стандартный поток ввода (клавиатура) в Java представлен объектом — System.in. А стандартный поток вывода (дисплей) —объектом System.out.
:
Метод hasNextDouble(), применённый объекту класса Scanner, проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() — считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит).
Пример ошибки считывания введенного значения без предварительной проверки:
Имеется также метод nextLine(), позволяющий считывать целую последовательность символов, т.е. строку, а, значит, полученное через этот метод значение нужно сохранять в объекте класса String. В следующем примере создаётся два таких объекта, потом в них поочерёдно записывается ввод пользователя, а далее на экран выводится одна строка, полученная объединением введённых последовательностей символов:
Класс String
Класс String содержит основные методы для работы со строками:
-
concat(String s) или + – слияние строк;
-
equals(Object ob), equalsIgnoreCase(String s) – сравнение строк с учетом и без учета регистра;
-
compareTo(String s), compareToIgnoreCase (String s) – лексикографическое сравнение строк с учетом и без учета регистра;
-
contentEquals(StringBuffer ob) – сравнение строки и содержимого объекта типа StringBuffer;
-
charAt(int n)– извлечение из строки символа с указанным номером (нумерация с нуля);
-
substring(int n, int m)- извлечение из строки подстроки длины m-n, начиная с позиции n;
-
length() – определение длины строки;
-
valueOf(объект) – преобразование примитивного объекта к строке;
-
toUpperCase() / toLowerCase() – преобразование всех символов вызывающей строки в верхний/нижний регистр;
-
replace(char с1, char с2) – замена в строке всех вхождений первого символа вторым символом;
-
getBytes(параметры), getChars(параметры) – извлечение символов строки в виде массива байт или символов.