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», і ми хочемо замінити ім’я домену на codegym.com. Домен в урлах може бути різним, але ми знаємо, що:

  • Перед ім’ям домену йдуть два слеші //
  • Після імені домену йде один слеш /

Ось як би виглядав код такої програми:

Код Примітки
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 + "codegym.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)
Повторює поточний рядок count разів
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 Рівень 11
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
Воно то може й так. ЧОМУ тоді росверсія дуже відрізняється від української? Вся реклама, та й обгортка курсу - не українською. Коли продукт український, тоді питання до розробників - чому досі не змінено?