JavaRush /Курсы /Java Multithreading /Регулярные выражения, примеры

Регулярные выражения, примеры

Java Multithreading
2 уровень , 11 лекция
Открыта
Регулярные выражения, примеры - 1

— А сейчас я расскажу тебе о регулярных выражениях. Это одновременно и сложная, и простая тема. Чтобы досконально разобраться в регулярных выражениях может понадобиться прочитать пару-тройку нетонких книг, но научить тебя пользоваться ими я могу прямо сейчас.

Как любят шутить опытные программисты – если у вас есть проблема и вы захотели решить ее с помощью регулярных выражений, то теперь у вас две проблемы.

— Гм.

— Надеюсь, я не сильно тебя запугал, мой друг. Нет?

Вот и отлично. Итак, новая тема или что же такое «регулярные выражения»?

Если сильно упростить, то регулярные выражения – это шаблон для строки.

Ты можешь проверить – соответствует ли некоторая строка заданному шаблону или нет. Также можно разбивать строку на части, используя символ-разделитель или строку-шаблон.

Но начнем с простого – что же такое шаблон строки?

В SQL, не в Java, при сравнении строк можно проверять – совпадает ли строка с определенным шаблоном или нет. Вот как это выглядит:

name like 'Alex%'

Тут name – это переменная, like – это команда для проверки шаблона, а ‘Alex%’ – это шаблон.

В данном случае % обозначает любую строку или подстроку.

Шаблон Строки подходящие под шаблон
‘Alex%’ Alex
Alexandr
Alexander
Alexandra
….
‘%x%’ Max
Maxim
Alexandr
‘%a’ Olga
Helena
Ira

Если нужно было обозначить, что любой символ должен быть всего один, то для этого в SQL используется знак подчеркивания – «_».

Шаблон Строки подходящие под шаблон
‘Alex%_’ Alex
Alexandr
Alexander
Alexandra
….
‘_x’ Ax
Bx
Cx
‘___’ Aaa
Aab
Bbb

— В общем – понятно.

— Отлично, тогда перейдем к регулярным выражениям.

В регулярных выражениях принято задавать ограничение не только на «количество символов», но и на «содержание символа». Любая «маска» обычно состоит из двух (иногда больше) частей, первая из которых описывает «предпочтения» в символах, а вторая часть – их количество.

Вот тебе несколько примеров содержания символа:

Шаблон Описание Примеры
. Один любой символ 1
\d Любая цифра 7
\D Любая нецифра C
\s Пробел, перенос строки, символ табуляции ‘ ‘
\S Что угодно, кроме пробела, табуляции, переноса строки f
[a-z] Любая буква от a до z z
[0-9] Любая цифра от 0 до 9. 8
\w Любой цифробуквенный символ или нижнее подчеркивание c
\W Любой не цифробуквенный символ -

— Сразу не запомню, но выглядит не очень сложно.

— Отлично, тогда еще примеры количества символов в маске:

Шаблон Описание Примеры
A? Символ A встречается 0..1 раз A
B+ Символ B встречается 1.. ∞ раз BBBB
C* Символ C встречается 0.. ∞ раз CCC
D{n} Символ D встречается n раз DDDD, для шаблона D{4}
E{n,} Символ E встречается n.. ∞ раз EEEEEEE, для шаблона E{2,}
F{n,m} Символ F встречается n..m раз EEEE, для шаблона E{2,4}

— Тут вообще все очевидно.

— Ты схватываешь все просто на лету. А теперь посмотрим, как все это смотрится вместе:

Шаблон Описание Примеры
[a-d]? Символы a-d встречаются 0..1 раз a, b, c, d
[b-d,z]+ Символы b,c,d,z встречаются 1.. ∞ раз b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Символы 1,7,8,9 встречаются 0.. ∞ раз 1, 7, 9, 9777, 111199
1{5} Символ 1 встречается 5 раз 11111
[1,2,a,b]{2} Символы 1,2,a,b встречаются 2 раза 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Символы a,0 встречаются 2..3 раз aa, a0,00,0a, aaa,000, a00,0a0, a0a

— Так понятно же все.

— Да. Гм. Или я все очень хорошо объясняю или ты слишком хорошо соображаешь. Но и то, и то нам на руку.

Вот тебе еще пара новых моментов.

Т.к. регулярные выражения часто используют для поиска подстрок в строке, то в шаблон добавлены еще два символа ^ и $.

«^» — означает, что подстрока обязана включать начало строки.

«$» — означает, что подстрока обязана включать конец строки.

Примеры:

Шаблон Строка и найденные подстроки, совпадающие с шаблоном
a{3} aaa a aaa a aaa
a{3}$ aaa a aaa a aaa
^a{3} aaa a aaa a aaa
^a{3}$ aaa a aaa a aaa

И еще одно важное дополнение.

В регулярных выражениях символы «[ ] \ / ^ $ . | ? * + ( ) { }» имеют специальное значение. Их еще называют «управляющие символы». Поэтому просто так их использовать в строке нельзя.

Как и в Java их необходимо экранировать. Для этого, как и в Java, используется символ «\».

Если мы хотим описать, что строка должна состоять из трех символов «?», то нельзя писать так: ?{3}, т.к. символ «?» является управляющим. Надо сделать так: \?{3}, если мы хотим задать символ «\», то надо написать «\\».

— Ок, понятно.

— А теперь еще маленькая интересная новость. В java, в файлах с кодом, внутри строк символ «\» тоже нужно экранировать, т.к. он является управляющим.

— Ну да.

— Так вот, если ты попытаешься задать шаблон регулярного выражения в java внутри строки, то тебе нужно будет экранировать символ \ дважды.

Пример:

Я хочу задать маску «c:\что-угодно»
Регулярное выражение, по идее, должно выглядеть так:
один символ «с»,
двоеточие,
слеш,
точка и звездочка (для обозначения любого количества символов).Я добавил пробелов для лучшей читабельности:
c : \ .*
Но символы «\» и «.» нужно экранировать, поэтому регулярное выражение будет выглядеть так:
c :  \\\.*
Или, без пробелов
c:\\\.*
В регулярном выражении у нас должно быть три слеша (слеш – косая черта)
Поэтому регулярное выражение в java-файле будет выглядеть так:
String regexp = "c:\\\\\\.*";

— Ого! Ничего себе. Буду знать.

— И если ты решил посильнее в этом разобраться, то вот тебе пара хороших ссылок:

Лекция на вики

Комментарии (186)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Alex Уровень 51
17 апреля 2025
Задачки на понимание регулярок: https://regexcrossword.com/
Den Winchester Уровень 32
22 октября 2025
Вот это действительно очень полезно. Спасибо! :)
Antariko Уровень 1
25 февраля 2025
О, ну да, как же своевременно то.
Валихан Уровень 33 Expert
25 ноября 2024
Регулярки я изучил, проходя 19-й уровень. Если кто еще не проходил, вот ссылки для изучения: https://javarush.com/groups/posts/regulyarnye-vyrazheniya-v-java https://javarush.com/groups/posts/2679-regex-20-korotkikh-shagov-dlja-osvoenija-reguljarnihkh-vihrazheniy-chastjh-1 Потренировать регулярки: https://regex101.com/r/Mf9L3O/9
No Name Уровень 12
23 ноября 2024
+ лекция в копилке
JavaRusher853 Уровень 36
16 сентября 2024
Опоздали вы с этой темой где-то так на ВЕЧНОСТЬ, уже все давным давно все знают потому что в гугле не забанили, и были уровни как раз regEx 👍🤙👊
Bronislav Уровень 34 Expert
24 августа 2024
Если вы задаетесь вопросом: "Это не логично, что за чушь они несут в этой лекции?" - то вы правы. Это правда, что в Java строковые литералы имеют управляющий символ обратной косой черты \ для обозначения, к примеру переноса строки \n и выглядит это так:

String s = "Что-то в первой строке\nЧто-то начиная с новой строки"
System.out.print(s);
Вывод в консоль:

Что-то в первой строке
Что-то начиная с новой строки
С этим думаю разобрались, понятно зачем экранировать строковые литералы в Java. Теперь про регулярные выражения вне контекста Java. Если бы мы захотели составить шаблон для строки "c:\что-то", то нам бы пришлось экранировать обратную косую черту, потому что она в регулярных выражениях тоже является управляющим символом. К слову экранировать обычную косую черту / - нет необходимости, ни в Java ни в регулярных выражениях она не является управляющим символом. Таким образом наше регулярное выражение вне контекста Java выглядело бы следующим образом "c:\\.*" Зная как работают строковые литералы в Java мы понимаем, если мы хотим записать в коде такой шаблон "c:\\.*" в виде литерала в Java, то мы вынуждены экранировать управляющие символы строковых литералов Java, поэтому у нас получается следующий литерал "c:\\\\.*" Java компилятор обработает этот строковый литерал и увидит в нем строку "c:\\.*", которую затем передает компилятору регулярных выражений как корректный шаблон, и при поиске совпадений наш шаблон найдет совпадение в строке "c:\что-то". Проверяем на практике:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("c:\\\\.*");
        Matcher m = p.matcher("c:\\что-то");
        boolean b = m.matches();
        System.out.println(b); // true
    }
}
SomeBody098 Уровень 51
19 июля 2024
00101101 11010000 10011100 11010000 10111000 11010000 10111010 11010001 10000000 11010000 10111110 11010000 10110010 11010000 10111110 11010000 10111011 11010000 10111101 11010000 10111110 11010000 10110010 11010000 10111010 11010000 10110000 00100000 11010001 10000000 11010000 10110000 11010000 10110001 11010000 10111110 11010001 10000010 11010000 10110000 11010000 10110101 11010001 10000010 00111111 00001010 00101101 11010000 10011010 11010000 10110000 11010000 10111010 00100000 11010001 10000111 11010000 10110000 11010001 10000001 11010001 10001011 00100001 00001010 00101101 11010000 10011110 11010000 10111101 11010000 10110000 00100000 11010000 10110110 11010000 10110101 00100000 11010000 10111101 11010000 10110101 00100000 11010000 10110011 11010001 10000000 11010000 10110101 11010000 10110101 11010001 10000010 00001010 00101101 11010000 10011010 11010000 10110000 11010000 10111010 00100000 11010001 10000111 11010000 10110000 11010001 10000001 11010001 10001011 00100000 11010000 10111000 00100000 11010001 10000000 11010000 10110000 11010000 10110001 11010000 10111110 11010001 10000010 11010000 10110000 11010000 10110101 11010001 10000010 00100001
Бромгексин Уровень 38
7 августа 2024
utf-8?
Бромгексин Уровень 38
7 августа 2024
-Микроволновка работает? -Как часы! -Она же не греет -Как часы и работает!
SomeBody098 Уровень 51
7 августа 2024
да да да )))
Private Joker Уровень 36
25 июня 2024
Благо есть сейчас нейросети, которые напишут тебе любую регулярку и не надо мучить анус запоминая все эти символы и их комбинации.
kaidzualex Уровень 5 Expert
26 июня 2024
Благо ли?) Сегодня пишут регулярку вместо тебя, а завтра будут писать код вместо тебя. Здорово, не нужно работать, цифровой коммунизм? Или еще большее социальное расслоение и уничтожение социальных лифтов? Время покажет, но бесспорно на текущем этапе это удобно. Просто иногда стоит бояться своих желаний
Private Joker Уровень 36
26 июня 2024
конечно благо. По твоей странной логике, тогда нельзя пользоваться стаковерфлоу, можно читать только документацию и книги. В коммунизме все работают, ты видимо не в курсе. Остальной твой душный комментарий разбирать не буду.
kaidzualex Уровень 5 Expert
26 июня 2024
Удачи пройти собес без способности самому писать регулярки. Против stackoverflow ничего не имею. С коммунизмом я достаточно знаком, так же я знаком с гарантированным безусловным доходом, который получали бы все граждане от средств производства, и по мере развития ИИ просто работали бы меньше, были счастливее. Однако реалии рынка и капитализма показывают что теперь проще нанимать индуса пишущего с помощью ChatGPT миллиард строк кода в наносекнду, чем растить толковых, но очень дорогих спецов. Как бы это ни было прискорбно, но придется принять факт постепенного упразднения интеллектуального труда, и чем этот труд выше оплачивается, тем раньше его будут стараться заместить. Синие воротнички, как ни странно, остаются на последок. А еще очень любят смотреть на софт скиллы в компаниях, у тебя, кажется, большие проблемы с агрессией и аргументацией. Очень жаль. Желаю успехов в борьбе со своими пороками, ведь коммунистическое "От каждого по способностям, каждому по потребностям" так и остается в утопичных мечтах отдельных индивидов. У нас "Каждому по способностям, а утопающие пусть сами себя спасут"
Private Joker Уровень 36
26 июня 2024
Ты пей таблетки там, не забывай.
Максим Li Уровень 1
19 мая 2024
19.05.2024
Ислам Уровень 33
8 апреля 2024
Nice