JavaRush/Курси/Java Syntax Zero/Робота з рядками в Java

Робота з рядками в Java

Відкрита

1. Порівняння рядків

Порівняння — це одна з найпопулярніших операцій із рядками. Клас String має понад десять різних методів для порівняння рядків між собою. Далі ми розглянемо вісім основних методів.

Методи Опис
boolean equals(String str)
Рядки вважаються однаковими (рівними), якщо всі їхні символи збігаються.
boolean equalsIgnoreCase(String str)
Порівнює рядки, ігноруючи регістр (розмір) літер.
int compareTo(String str)
Порівнює рядки лексикографічно. Повертає: 0, якщо рядки однакові; число менше за нуль, якщо поточний рядок менший за рядок-параметр; число більше за нуль, якщо поточний рядок більший за рядок-параметр.
int compareToIgnoreCase(String str)
Порівнює рядки лексикографічно, ігноруючи регістр літер. Повертає: 0, якщо рядки однакові; число менше за нуль, якщо поточний рядок менший за рядок-параметр; число більше за нуль, якщо поточний рядок більший за рядок-параметр.
boolean regionMatches(int toffset, String str, int offset, int len)
Порівнює частини рядків.
boolean startsWith(String prefix)
Перевіряє, чи починається поточний рядок із підрядка prefix.
boolean endsWith(String suffix)
Перевіряє, чи закінчується поточний рядок підрядком suffix.

Припустімо, нам потрібно написати програму, яка просить користувача ввести шлях до файлу й перевіряє, що це за файл, за розширенням його імені. Код такої програми матиме такий вигляд:

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

if (path.endsWith(".jpg") || path.endsWith(".jpeg"))
{
   System.out.println("Це Jpeg!");
}
else if (path.endsWith(".htm") || path.endsWith(".html"))
{
   System.out.println("Це HTML-сторінка");
}
else if (path.endsWith(".doc") || path.endsWith(".docx"))
{
   System.out.println("Це документ Word");
}
else
{
   System.out.println("Невідомий формат");
}
Створення об'єкта Scanner
Читання рядка з консолі

Перевірка, чи закінчується рядок path заданим підрядком

10
Задача
Java Syntax Zero,  10 рівень,  5 лекція
Недоступна
Перевірка URL-адреси
Перевірка URL-адреси

2. Пошук підрядків

Друга за популярністю операція після порівняння рядків — це пошук одного рядка в іншому. Для цього клас String теж має кілька методів:

Методи Опис
int indexOf(String str)
Шукає рядок str в поточному рядку. Повертає індекс першого символу знайденого рядка.
int indexOf(String str, int index)
Шукає рядок str в поточному рядку, починаючи із символу з індексом index. Повертає індекс першого символу знайденого рядка.
int lastIndexOf(String str)
Шукає рядок str в поточному рядку, починаючи з кінця. Повертає індекс першого символу знайденого рядка (тобто індекс останнього входження).
int lastIndexOf(String str, int index)
Шукає рядок str в поточному рядку ззаду наперед, починаючи із символу з індексом index; повертає індекс першого символу знайденого рядка (тобто індекс останнього входження).
boolean matches(String regex)
Перевіряє, чи збігається поточний рядок із шаблоном, який задано регулярним виразом.

Методи indexOf(String) і indexOf (String, index) часто використовуються разом. Перший дає змогу знайти перше входження переданого підрядка в поточному рядку. А другий метод знаходить друге, третє і т. д. входження завдяки тому, що пропускає перші index символів.

Припустімо, маємо таку URL-адресу: «https://domen.com/about/reviews», і хочемо замінити ім'я домену на javarush.com. Домени в URL-адресах можуть бути різними, але ми можемо виділити їх за такими ознаками:

  • Імені домену передують дві скісні риски //
  • Після імені домену ставиться одна скісна риска /

Цю програму можна написати отак:

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

int index = path.indexOf("//");
int index2 = path.indexOf("/", index + 2);

String first = path.substring(0, index + 2);
String last = path.substring(index2);

String result = first + "javarush.com" + last;
System.out.println(result);
Створення об'єкта Scanner
Читання рядка з консолі

Отримуємо індекс першого входження рядка //
Отримуємо індекс першого входження рядка /, але шукаємо тільки після символів //.
Отримуємо рядок від початку і закінчуючи символами //
Отримуємо рядок від / і до кінця.

Склеюємо рядки і отримуємо новий домен.

Методи lastIndexOf(String) і lastIndexOf(String, index) працюють так само, тільки пошук ведеться у зворотному напрямку, починаючи з кінця рядка.


10
Задача
Java Syntax Zero,  10 рівень,  5 лекція
Недоступна
Пошук в рядку
Пошук в рядку

3. Створення підрядків

Наступною за популярністю після порівняння рядків і пошуку підрядків є операція отримання підрядка з рядка. У попередньому прикладі ви бачили виклик методу substring(), який повертав частину рядка.

Наводимо 8 методів отримання підрядків із поточного рядка:

Методи Опис
String substring(int beginIndex, int endIndex)
Повертає підрядок, визначений інтервалом символів beginIndex..endIndex.
String repeat(int count)
Повторює поточний рядок n разів.
String replace(char oldChar, char newChar)
Повертає новий рядок, де символ oldChar замінено на символ newChar.
String replaceFirst(String regex, String replacement)
Замінює в поточному рядку підрядок, визначений регулярним виразом, на заданий підрядок.
String replaceAll(String regex, String replacement)
Замінює в поточному рядку всі підрядки, визначені регулярним виразом, на заданий підрядок.
String toLowerCase()
Перетворює всі літери в рядку на малі.
String toUpperCase()
Перетворює всі літери в рядку на великі.
String trim()
Видаляє всі пробіли на початку та в кінці рядка.

Короткий опис цих методів:

Метод substring(int beginIndex, int endIndex)

Метод substring повертає новий рядок, який містить символи поточного рядка починаючи із символу з індексом beginIndex і закінчуючи символом до індексу endIndex. Не забувайте, що в Java інтервали не включають елементи з кінцевим індексом, тобто символ з індексом endIndex у новий рядок не входить. Приклади:

Код Результат
"Привіт".substring(0, 3);
"При"
"Привіт".substring(1, 4);
"рив"
"Привіт".substring(1, 6);
"ривіт"
"Привіт".substring(1);
"ривіт"

Якщо параметр endIndex не вказано (а так можна), вибирається підрядок починаючи від символу beginIndex і до кінця рядка.

Метод repeat(int n)

Метод repeat просто повторює поточний рядок n разів. Приклад:

Код Результат
"Привіт".repeat(3);
"ПривітПривітПривіт"
"Привіт".repeat(2);
"ПривітПривіт"
"Привіт".repeat(1);
"Привіт"
"Привіт".repeat(0);
""

Метод replace(char oldChar, char newChar)

Метод replace() повертає новий рядок, де всі символи oldChar замінено на символ newChar. Довжина рядка під час цієї операції не змінюється. Приклад:

Код Результат
"Привіт".replace('Я', 'я');
"Привіт"
"Привіт".replace('т', 'д');
"Привід"
"Привіт".replace('и', 'е');
"Превіт"
"Привіт".replace('и', 'і');
"Прівіт"

Методи replaceFirst() і replaceAll()

Метод replaceAll() замінює всі входження підрядка, переданого в першому параметрі, на підрядок, переданий у другому параметрі. Метод replaceFirst() замінює перше входження підрядка, переданого в першому параметрі, на підрядок, переданий у другому параметрі. Підрядок, який потрібно замінити, визначається регулярним виразом. Регулярні вирази ми розглядатимемо в квесті Java Multithreading.

Приклади:

Код Результат
"Good news everyone!".replaceAll("e.", "EX");
"Good nEXs EXEXyonEX"
"Good news everyone!".replaceAll("o.", "-o-");
"G-o-d news every-o-e!"
"Good news everyone!".replaceFirst("e.", "EX");
"Good nEXs everyone!"
"Good news everyone!".replaceFirst("o.", "-o-");
"G-o-d news everyone!"

Методи toLowerCase() і toUpperCase()

З цими методами ви познайомилися ще тоді, коли тільки починали вивчати методи класу String.

Метод trim()

Метод trim() видаляє пробіли на початку та в кінці рядка. Пробіли всередині рядка ігноруються. Приклади:

Код Результат
"     ".trim();
""
"Привіт".trim();
"Привіт"
" Привіт\n як справи?\n   ".trim();
"Привіт\n як справи?\n"
"  Пароль\n   \n ".trim();
"Пароль\n   \n"

10
Задача
Java Syntax Zero,  10 рівень,  5 лекція
Недоступна
Оновлення шляху
Оновлення шляху
Коментарі (30)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
ZedCj
Рівень 11
Expert
2 серпня 2025, 07:39
trim() видаляє пробільні символи, це також стосується табуляції \t та \n. Але в прикладі наведено (Код: " Пароль\n \n ".trim(); Результат: "Пароль\n \n"), а на ділі результат: "Пароль".
Anonymous #3425794
Рівень 1
28 січня 2025, 22:45
return path.replace("jdk1.8", jdk); не розумію, що не так...
10 лютого 2025, 22:52
Ти можеш не знати, яка версія була, а якщо вона прийшла параметром, і ти її не бачиш? Шо, якщо там 1.9 буде, а не 1.8, а ти намагаєшся замінити 1.8? Звісно метод не знайде твоєї підстроки тоді, і нічого не замінить. Тому і не так). Тому нам треба самому програмно знайти версію, відштовхуючись від того, що є підстрока "jdk", і шукай її повну назву до наступного слеша. Як варіант, можна ось так: int index = path.indexOf("jdk"); int index2 = path.indexOf("/", index); String oldJdk = path.substring(index, index2); return path.replaceAll(oldJdk,jdk);
IronMan57
Рівень 28
8 грудня 2024, 01:26
В останній задачі для отримання правильного результату можна обійтись однією стрічкою коду з використанням методу replace і регулярного виразу, але такий результат не проходить валідацію.
IronMan57
Рівень 28
8 грудня 2024, 00:34
Для інформації: В методах replaceFirst() і replaceAll() перший параметр - це регулярний вираз, за допомогою якого задається, яку послідовність символів потрібно замінити. Регулярний вираз - це щось на зразок формули або шаблону. Символ крапки "." в регулярному виразі означає любий один символ. Коли першим аргументом методу replaceFirst() або replaceAll() задається рядок "e.", це означає, що потрібно шукати послідовність з двох символів, перший з яких це літера "e", а другий - будь-який інший символ. Тому у рядку "Good news everyone!" будуть знайдені та замінені послідовності з двох символів "ew", "ev", "er", "e!".
Гаркін
Рівень 14
6 квітня 2024, 19:06
А пояснити, що крапка при заміні у прикладах
"Good news everyone!".replaceAll("e.", "EX");
то заміна і символа що поруч з цією буквою, то не треба?
Василь trainee в Kindgeek
11 серпня 2023, 17:52
в прикладах використання методів:
replaceAll
replaceFirst
є помилки.
15 лютого 2024, 11:40
Можливо вони крапкою показують, що міняють 2 символа в поточному рядку, тоді логіка працює. Але тоді у них немає повного пояснення, що то є (приклад с крапкою після символу).
Ігор
Рівень 41
Expert
16 травня 2023, 11:28
регулярки це срака, регулярки це срака, регулярки це сракааааа 😭
Yurii Kuzniak
Рівень 30
18 травня 2023, 23:51
Де ти тут регулярки побачив?
Ігор
Рівень 41
Expert
26 травня 2023, 08:39
то я завчасно злякався злякався 😬
Yurii Kuzniak
Рівень 30
26 травня 2023, 22:31
та я теж думав щось нове, але перечитав, та виявилось що воно буде вже далі ніж кор, так що не лякайся)
Ігор
Рівень 41
Expert
3 червня 2023, 10:58
а хто в тебе куратор?
Yurii Kuzniak
Рівень 30
18 червня 2023, 10:01
В сенсі куратор?
Vitalii Backend Developer
19 серпня 2023, 23:02
срака це екранування рядків в java та те як регулярки записуються в рядки.
Де ти тут регулярки побачив?
тут є метод для пошуку й заміни по регулярці. нафіга його тут дали - питання до авторів.
les_yeux_blancs QA Automation Engineer
22 квітня 2023, 19:45
Ні, ну віладатор реально тупить: в умові останнього завдання не вказано, які методи використовувати, а значить можна вирішувати будь-яким, але моє рішення він не приймає: public static String changePath(String path, String jdk) { return path.replaceFirst("jdk[0-9.]+", jdk); }
Andriy
Рівень 26
3 червня 2023, 08:35
Можливо справа в тому, що валідатор перевіряє також з версіями, які можуть містити символи та літери? Наприклад, були версії jdk 5.0u30 та 1.4.2_32. Такі версії не пройдуть regex
Vitalii Backend Developer
19 серпня 2023, 23:04
у нас регулярка кривувата. ось так проходить:
return path.replaceAll("/(jdk[A-Za-z0-9-_\\.]+)/", "/" + jdk + "/");
Ivan Lebid'
Рівень 108
Expert
8 березня 2023, 12:12
В завданні "Оновлення шляху" валідатор не приймає рішееня: public static String changePath(String path, String jdk) { int firstIndex = path.indexOf("jdk"); int lastIndex = path.lastIndexOf("/"); String version = path.substring(firstIndex,lastIndex); return path.replace(version, jdk); } код працює і навіть схожий з рішенням в самій ідеї, єдине що відрізняється це рядок lastIndex, а точніше метод яким шукаємо(indexOf(String, int)). Хіба не все одно яким методом шукати lastIndex? Группі Abstract привіт:)
Дима
Рівень 16
Expert
23 березня 2023, 16:31
int lastIndex = path.indexOf ("/",firstIndex );
Andriy
Рівень 26
3 червня 2023, 08:41
Спочетку теж так вирішив. Як тільки не пройшло валідацію, то подумав, що у валідаторі може бути тест, де в кінці шляху є ще один символ '/'. Так що імхо це валідний фейл
Yaroslav Tkachyk
Рівень 23
Expert
25 грудня 2022, 23:20
1. Порівняння рядків ....Далі ми розглянемо вісім основних методів.....