JavaRush/Курсы/Java Multithreading/StringTokenizer, String.replace, String.split

StringTokenizer, 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 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.

— Да, тут тоже все понятно. Может я не сразу смогу сам написать такой код, но то, что тут происходит, мне ясно.

— Отлично, тогда будем считать, что тему ты освоил.

Комментарии (85)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Antariko
Уровень 1
25 февраля 2025, 13:27
А объясните кто понимает первый пример в этой лекции. Boolean test = s.matches("news.*"); В выводе они по контексту ждут, что эта регулярка проверяет не начинается ли строка на эту самую регулярку. Но ведь обращаясь к прошлой лекции мы узнаем, что чтобы задать выражение с которого должна начинаться строка, нужно писать символ - ^, перед выражением. А тут мы просто, как я понял, ищем есть ли в предложении слово news и любое количество символов после него, разве нет?
Ruslan Skalden Backend Developer
2 сентября 2025, 10:13
matches() в Java проверяет, соответствует ли ВСЯ строка целиком регулярному выражению. Не "содержит", а именно "целиком совпадает".
"abc".matches("abc")   // true
"abc".matches("a")     // false
"abc".matches(".*a.*") // true, потому что .*a.* покрывает всю строку
String s = "Good news everyone!";
boolean test = s.matches("news.*");
Регулярка "news.*" говорит что строка должна начинаться с "news", а потом может быть ноль или больше любых символов. Но строка "Good news everyone!" начинается с "Good", а не с "news". Поэтому результат false. То есть:
s.matches("news.*");
// что равняется одному и тому же
s.matches("^news.*");
А если нужно проверить содержит ли строка "news" тогда нужно использовать метод contains
boolean contains = s.contains("news");
Duxa552
Уровень 2
26 сентября 2024, 12:18
Отлично, тогда будем считать, что тему ты освоил. В принципе, как и все темы в этом модуле
Илюха Будущий ЮниорJava - стажёр в ASTON
16 сентября 2024, 10:22
Вовремя.
SomeBody098веник в бане
19 июля 2024, 07:43
у меня странное предчувствие к следующей лекции...
Максим Li Backend Developer
19 мая 2024, 16:30
19.05.2024
Ислам
Уровень 33
13 апреля 2024, 18:09
Nice
Dmitry Shaburov
Уровень 33
7 марта 2024, 08:00
07.03.2024
13 декабря 2023, 10:18
Важно помнить, что если нам нужно найти последовательность символов и символ "." (точка), то мы пишем регулярное выражение (например, на ресурсе regex101) - "max\." (без кавычек). Тогда в проверяемой строке будет поиск совпадения (строго) со следующей последовательностью символов - "max.". Но когда мы регулярное выражение скопируем и вставим в IntelliJ IDEA, то среда разработка добавит еще одну косую линию (\) и получится - "max\\." (без кавычек). В среде разработки, в строковом литерале (String reg = "max\\.";) необходимо каждую косую линию (\) экранировать еще одной.
kalkulator¹
Уровень 51
12 января 2023, 09:40
/* Комментарий удален */
11 февраля 2023, 13:58
это почему же?
Ada
Уровень 1
11 июля 2022, 05:16
Кто-нибудь понял, почему с таким кодом:
String s = "Good news everyone!";
String[] ss = s.split("ne");
System.out.println(Arrays.toString(ss));
Мы получаем "Good ", "ws everyo", "!". А с таким кодом:
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 ! Ведь в обоих методах одинаковый разделитель.
Anonymous #3062817
Уровень 47
11 июля 2022, 08:51
split() вопспринимает буквально, что надо искать только "ne" в то время как tokenizer ищет "[ne]" одну из этих букв
Ada
Уровень 1
11 июля 2022, 09:10
спасибо!
21 февраля 2024, 10:41
спасибо!