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

StringTokenizer, String.replace, String.split

Java Multithreading
2 уровень , 12 лекция
Открыта

— Привет, Амиго!

Насколько я знаю, Риша уже рассказал тебе о регулярных выражениях.

— Да, было очень интересно.

— Отлично, теперь я расскажу тебе о работе со строками с помощью регулярных выражений.

Начнем мы с самого простого:

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.

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

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

Комментарии (92)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Antariko Уровень 1
25 февраля 2025
А объясните кто понимает первый пример в этой лекции. Boolean test = s.matches("news.*"); В выводе они по контексту ждут, что эта регулярка проверяет не начинается ли строка на эту самую регулярку. Но ведь обращаясь к прошлой лекции мы узнаем, что чтобы задать выражение с которого должна начинаться строка, нужно писать символ - ^, перед выражением. А тут мы просто, как я понял, ищем есть ли в предложении слово news и любое количество символов после него, разве нет?
Ruslan Skalden Уровень 36
2 сентября 2025
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 Уровень 1
26 сентября 2024
Отлично, тогда будем считать, что тему ты освоил. В принципе, как и все темы в этом модуле
16 сентября 2024
Вовремя.
SomeBody098 Уровень 51
19 июля 2024
у меня странное предчувствие к следующей лекции...
Максим Li Уровень 1
19 мая 2024
19.05.2024
Ислам Уровень 33
13 апреля 2024
Nice
Dmitry Shaburov Уровень 33
7 марта 2024
07.03.2024
Денис Черемных Уровень 29
13 декабря 2023
Важно помнить, что если нам нужно найти последовательность символов и символ "." (точка), то мы пишем регулярное выражение (например, на ресурсе regex101) - "max\." (без кавычек). Тогда в проверяемой строке будет поиск совпадения (строго) со следующей последовательностью символов - "max.". Но когда мы регулярное выражение скопируем и вставим в IntelliJ IDEA, то среда разработка добавит еще одну косую линию (\) и получится - "max\\." (без кавычек). В среде разработки, в строковом литерале (String reg = "max\\.";) необходимо каждую косую линию (\) экранировать еще одной.
kalkulator¹ Уровень 51
12 января 2023
/* Комментарий удален */
11 февраля 2023
это почему же?
Ada Уровень 1
11 июля 2022
Кто-нибудь понял, почему с таким кодом:

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
split() вопспринимает буквально, что надо искать только "ne" в то время как tokenizer ищет "[ne]" одну из этих букв
Ada Уровень 1
11 июля 2022
спасибо!
21 февраля 2024
спасибо!