Назад Зміст Вперед

2.3 Приклади обробки Strings із використанням технології регулярних виразів

Приклади кількості символів в масці:
Шаблон
Опис
Приклади
.
Один будь-який символ
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.
Метод
Приклад
boolean matches(String regex)
String s = "Good news everyone!";
Boolean test = s.matches("news\\.*");
Результат:
false (рядок не починається зі слова news)

2) Як замінити всі підрядка, задані маскою, на потрібні нам?
  Для цього є два методи.
Метод replaceAll замінює всі входження одного підрядка в інший.
Метод replaceFirst замінює перше входження підрядка на заданий підрядок.
Метод
Приклад
String replaceAll(String regex, String replacement)
String s = "Good neweveryone!";
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.


Задача. Перевірка номера телефону

Метод 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
.