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

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

Java Syntax Zero
Рівень 10 , Лекція 5
Відкрита

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 заданим підрядком


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) працюють так само, тільки пошук ведеться у зворотному напрямку, починаючи з кінця рядка.



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"

Коментарі (33)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
ZedCj Рівень 11 Expert
2 серпня 2025
trim() видаляє пробільні символи, це також стосується табуляції \t та \n. Але в прикладі наведено (Код: " Пароль\n \n ".trim(); Результат: "Пароль\n \n"), а на ділі результат: "Пароль".
Anonymous #3425794 Рівень 1
28 січня 2025
return path.replace("jdk1.8", jdk); не розумію, що не так...
10 лютого 2025
Ти можеш не знати, яка версія була, а якщо вона прийшла параметром, і ти її не бачиш? Шо, якщо там 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
В останній задачі для отримання правильного результату можна обійтись однією стрічкою коду з використанням методу replace і регулярного виразу, але такий результат не проходить валідацію.
IronMan57 Рівень 28
8 грудня 2024
Для інформації: В методах replaceFirst() і replaceAll() перший параметр - це регулярний вираз, за допомогою якого задається, яку послідовність символів потрібно замінити. Регулярний вираз - це щось на зразок формули або шаблону. Символ крапки "." в регулярному виразі означає любий один символ. Коли першим аргументом методу replaceFirst() або replaceAll() задається рядок "e.", це означає, що потрібно шукати послідовність з двох символів, перший з яких це літера "e", а другий - будь-який інший символ. Тому у рядку "Good news everyone!" будуть знайдені та замінені послідовності з двох символів "ew", "ev", "er", "e!".
Гаркін Рівень 14
6 квітня 2024
А пояснити, що крапка при заміні у прикладах

"Good news everyone!".replaceAll("e.", "EX");
то заміна і символа що поруч з цією буквою, то не треба?
Василь Рівень 4
11 серпня 2023
в прикладах використання методів:

replaceAll
replaceFirst
є помилки.
15 лютого 2024
Можливо вони крапкою показують, що міняють 2 символа в поточному рядку, тоді логіка працює. Але тоді у них немає повного пояснення, що то є (приклад с крапкою після символу).
Ігор Рівень 41 Expert
16 травня 2023
регулярки це срака, регулярки це срака, регулярки це сракааааа 😭
Yurii Kuzniak Рівень 30
18 травня 2023
Де ти тут регулярки побачив?
Ігор Рівень 41 Expert
26 травня 2023
то я завчасно злякався злякався 😬
Yurii Kuzniak Рівень 30
26 травня 2023
та я теж думав щось нове, але перечитав, та виявилось що воно буде вже далі ніж кор, так що не лякайся)
Ігор Рівень 41 Expert
3 червня 2023
а хто в тебе куратор?
Yurii Kuzniak Рівень 30
18 червня 2023
В сенсі куратор?
Vitalii Рівень 11
19 серпня 2023
срака це екранування рядків в java та те як регулярки записуються в рядки.

Де ти тут регулярки побачив?
тут є метод для пошуку й заміни по регулярці. нафіга його тут дали - питання до авторів.
les_yeux_blancs Рівень 50
22 квітня 2023
Ні, ну віладатор реально тупить: в умові останнього завдання не вказано, які методи використовувати, а значить можна вирішувати будь-яким, але моє рішення він не приймає: public static String changePath(String path, String jdk) { return path.replaceFirst("jdk[0-9.]+", jdk); }
Andriy Рівень 26
3 червня 2023
Можливо справа в тому, що валідатор перевіряє також з версіями, які можуть містити символи та літери? Наприклад, були версії jdk 5.0u30 та 1.4.2_32. Такі версії не пройдуть regex
Vitalii Рівень 11
19 серпня 2023
у нас регулярка кривувата. ось так проходить:

        return path.replaceAll("/(jdk[A-Za-z0-9-_\\.]+)/", "/" + jdk + "/");
Ivan Lebid' Рівень 108 Expert
8 березня 2023
В завданні "Оновлення шляху" валідатор не приймає рішееня: 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
int lastIndex = path.indexOf ("/",firstIndex );
Andriy Рівень 26
3 червня 2023
Спочетку теж так вирішив. Як тільки не пройшло валідацію, то подумав, що у валідаторі може бути тест, де в кінці шляху є ще один символ '/'. Так що імхо це валідний фейл
Kostiantyn Bogatyrchuk Рівень 14 Expert
13 лютого 2023
''Припустімо, маємо таку URL-адресу: «https://domen.ru/about/reviews», і хочемо замінити ім'я домену на javarush.RU"', - от такої😞ніж у спину "JavaRush — український проєкт, онлайн-курс по вивченню програмування на Java. За 10 років існування мы зайняли міцну позицію на глобальному рынку. Сьогодні JavaRush — це 2 мільйони користувачів, що вивчають Java, а також більше 800 тисяч — на мультимовній версії курсу (проєкт CodeGym)." узято з https://jobs.dou.ua/companies/javarush/
15 лютого 2024
- да то ж раша! - тю, а й думав що то Рідна Україна.
Stas Semenyuk_ЗСУ Рівень 18
4 березня 2025
Воно то може й так. ЧОМУ тоді росверсія дуже відрізняється від української? Вся реклама, та й обгортка курсу - не українською. Коли продукт український, тоді питання до розробників - чому досі не змінено?