Приклади кількості символів в масці:
Шаблон
|
Опис
|
Приклади
|
.
|
Один будь-який символ
|
1
|
\d
|
Будь-яка цифра
|
7
|
\D
|
Будь-яка НЕцифра
|
C
|
\s
|
Пробіл,
|
' '
|
\S
|
Що завгодно, крім пробілу, табуляції, розриву рядків
|
f
|
[a-z]
|
Будь-яка буква от a до z
|
z
|
[0-9]
|
Будь-яка цифра от 0 до 9.
|
8
|
\w
|
Будь-яка буква
|
c
|
\W
|
Будь-яка НЕбуква
|
_
|
або
Шаблон
|
Опис
|
Приклади
|
A?
|
Символ A зустрічається 0..1 раз
|
A
|
B+
|
Символ B зустрічається 1.. ∞ раз
|
BBBB
|
C*
|
Символ C зустрічається 0.. ∞ раз
|
CCC
|
D{n}
|
Символ D зустрічається n раз
|
DDDD, для шаблона D{4}
|
E{n,}
|
Символ E зустрічається n.. ∞ раз
|
EEEEEEE, для шаблона E{2,}
|
F{n,m}
|
Символ F зустрічається n..m раз
|
EEEE, для шаблона E{2,4}
|
Шаблон
|
Опис
|
Приклади
|
[a-d]?
|
Символи a-d зустрічаються 0..1 разів
|
a, b, c, d
|
[b-d,z]+
|
Символи b,c,d,z зустрічаються 1.. ∞ разів
|
b, bcdcdbdbdbdbzzzzbbzbzb, zbz
|
[1,7-9]*
|
Символи 1,7,8,9 зустрічаються 0.. ∞
разів
|
1, 7, 9, 9777, 111199
|
1{5}
|
Символ 1 зустрічається 5 разів
|
11111
|
[1,2,a,b]{2}
|
Символи 1,2,a,b зустрічаються 2 рази
|
11, 12, 1a, ab, 2b, bb, 22
|
[a,0]{2,3}
|
Символи a,0 зустрічаються 2..3 рази
|
aa,
a0,00,0a, aaa,000, a00,0a0, a0a
|
Оскільки регулярні вирази часто використовують для пошуку підрядків у рядку, то в шаблон додані ще два символи ^ і $.
«^» - Означає, що підрядок зобов'язаний включати початок рядка.
«$» - Означає, що підрядок зобов'язаний включати кінець рядка.
Приклади
Приклади
Шаблон
|
Рядок і знайдені
підрядки, що збігаються з шаблоном
|
a{3}
|
aaa a aaa a aaa
|
a{3}$
|
aaa a aaa
a aaa
|
^a{3}
|
aaa a aaa a aaa
|
^a{3}$
|
aaa a aaa a
aaa
|
!!! І ще одне важливе доповнення.
У регулярних виразах символи «[] \ / ^ $. | ? * + () {} » мають спеціальне значення. Їх ще називають «керуючі символи». Тому просто так їх використовувати в рядку можна. Якщо ми хочемо описати, що рядок повинен складатися з трьох символів «?», То не можна писати так:? {3}, тому що символ «?» є керуючим. Треба зробити так: \? {3}, якщо ми хочемо задати символ «\», то треба написати «\\».
StringTokinizer, String.replace, String.split
1) Як перевірити, чи збігається рядок з шаблоном, заданим регулярним виразом:
Для цього є метод matches, в який передається рядок, що зберігає регулярний вираз, а метод повертає true або false.
Для цього є метод matches, в який передається рядок, що зберігає регулярний вираз, а метод повертає true або false.
Метод
|
Приклад
|
boolean matches(String regex)
|
String s = "Good news
everyone!";
Boolean test = s.matches("news\\.*"); |
Результат:
false (рядок не починається зі слова news) |
2) Як замінити всі підрядка, задані маскою, на потрібні нам?
Для цього є два методи.
Метод replaceAll замінює всі входження одного підрядка в інший.
Метод replaceFirst замінює перше входження підрядка на заданий підрядок.
Для цього є два методи.
Метод replaceAll замінює всі входження одного підрядка в інший.
Метод replaceFirst замінює перше входження підрядка на заданий підрядок.
Метод
|
Приклад
|
String replaceAll(String regex,
String replacement)
|
String s = "Good news everyone!";
String s2 = s.replaceAll ("e\\.","EX"); |
Результат:
s2 == "Good nEXs EXEXyonEX"; |
|
String replaceFirst(String regex,
String replacement)
|
String s = "Good news
everyone!";
String s2 = s.replaceFirst("e\\.","EX"); |
Результат:
s2 == "Good nEXs everyone!"; |
3) Як розбити рядок на частини?
Для цього є метод split, який приймає маску підрядок-роздільник:
Метод
|
Приклад
|
String[] split(String regex)
|
String s = "Good news
everyone!";
String[] ss = s.split("ne"); System.out.println(Arrays.toString(ss)); |
Результат (буде масив із трьох рядків):
[Good , ws everyo, !] "Good ", "ws everyo", "!"; |
Є ще один спосіб розбиття рядка на частини - за допомогою класу StringTokenizer
Цей клас не використовує регулярні вирази, замість цього в нього просто передається рядок, що складається з символів-роздільників. Переваги цього підходу в тому, що він не розбиває відразу весь рядок на шматочки, а потихеньку йде від початку до кінця.
Клас складається з конструктора і двох методів. У конструктор потрібно передати рядок, який розбиваємо на частини, і рядок - набір символів, що використовуються для поділу.
Метод nextToken повертає черговий токен - підрядок.
Метод hasMoreTokens () повертає true, якщо ще залишилися не віддані підрядки.
Метод
|
Приклад
|
boolean hasMoreTokens()
String nextToken() |
String s =
"Good news everyone!";
StringTokenizer tokenizer = new StringTokenizer(s,"ne"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); System.out.println(token); } |
Вивід на екран буде таким:
Good ws v ryo ! |
Зверніть увагу, що роздільником вважається будь-який символ, переданий у другому рядку в конструктор StringTokenizer.
Критерії валідності:
1) якщо номер починається з '+', то він містить 12 цифр
2) якщо номер починається з цифри або відкриває дужки, то він містить 10 цифр
3) може містити 0-2 знаків '-', які не можуть йти підряд
4) може містити 1 пару дужок '(' і ')', причому якщо вона є, то вона розташована лівіше знаків '-'
5) дужки всередині містять чітко 3 цифри
6) номер не містить букв
7) номер закінчується цифрою
Приклади:
Задача. Перевірка номера телефону
Метод checkTelNumber повинен перевіряти, чи є аргумент telNumber дійсним номером телефону.Критерії валідності:
1) якщо номер починається з '+', то він містить 12 цифр
2) якщо номер починається з цифри або відкриває дужки, то він містить 10 цифр
3) може містити 0-2 знаків '-', які не можуть йти підряд
4) може містити 1 пару дужок '(' і ')', причому якщо вона є, то вона розташована лівіше знаків '-'
5) дужки всередині містять чітко 3 цифри
6) номер не містить букв
7) номер закінчується цифрою
Приклади:
+380501234567 - true
+38(050)1234567 - true
+38050123-45-67 - true
050123-4567 - true
+38)050(1234567 - false
+38(050)1-23-45-6-7 - false
050ххх4567 - false
050123456 - false
(0)501234567 - false
+38(050)1234567 - true
+38050123-45-67 - true
050123-4567 - true
+38)050(1234567 - false
+38(050)1-23-45-6-7 - false
050ххх4567 - false
050123456 - false
(0)501234567 - false