Регулярные выражения (RegEx)
Регулярные выражения (RegExp) - язык, позволяющий выполнять оптимальный поиск в строке.
1. Основы регулярных выражений
Синтаксис создания:
- Литерал:
/pattern/flags
лучше всего использовать по умолчанию, если не требуется динамическое создание. - Конструктор:
new RegExp('pattern', 'flags')
при создании в таком виде, необходимо экранировать знак \. Использовать лучше всего в тех случаях, когда необходимо создание динамических регулярных выражений.
- Литерал:
Флаги:
g
(global): Поиск всех совпадений.i
(ignoreCase): Игнорирование регистра.m
(multiline): Многострочный режим.s
(dotAll): Разрешает.
совпадать с символами новой строки.u
(unicode): Обработка строк в формате Unicode.y
(sticky): Поиск с позиции в строке.
2. Символы и классы символов
Буквенные и цифровые символы:
\d
: Любая цифра (0-9).\D
: Любой символ, кроме цифры.\w
: Любая буква, цифра или_
.\W
: Любой символ, кроме\w
.\s
: Пробельный символ.\S
: Непробельный символ..
: Любой символ, кроме новой строки (зависит от флагаs
).
Классы символов:
[abc]
: Любой из символовa
,b
,c
.[^abc]
: Любой символ, кромеa
,b
,c
.[a-z]
: Любая строчная буква.[0-9]
: Любая цифра.
3. Якоря и границы
^
: Начало строки.$
: Конец строки.\b
: Граница слова.\B
: Не граница слова.
4. Группы и альтернативы
- Скобки для группировки:
(abc)
: Группа для захвата.(?:abc)
: Негруппирующая группа.(?<name>abc)
: Именованная группа захвата.
- Альтернатива:
a|b
: Либоa
, либоb
.
5. Повторители
{n}
: Ровноn
раз.{n,}
:n
раз или больше.{n,m}
: Отn
доm
раз.*
: 0 или больше раз (эквивалентно{0,}
).+
: 1 или больше раз (эквивалентно{1,}
).?
: 0 или 1 раз (эквивалентно{0,1}
).- Ленивая версия повторителя:
*?
,+?
,{n,m}?
: Минимальное количество совпадений.
6. Жадность и лень
- Жадные повторители (по умолчанию): Захватывают максимально возможное количество символов.
- Ленивые повторители (с
?
): Захватывают минимальное количество символов.
7. Обратные ссылки
\1
,\2
, …: Ссылаются на группы захвата.\k<name>
: Ссылка на именованную группу.
8. Утверждения
- Положительные:
(?=abc)
: После позиции должен бытьabc
(позитивный просмотр вперед).(?<=abc)
: Перед позицией должен бытьabc
(позитивный просмотр назад).
- Отрицательные:
(?!abc)
: После позиции не должно бытьabc
.(?<!abc)
: Перед позицией не должно бытьabc
.
9. Специальные символы
- Экранирование:
\
для специальных символов (.
,*
,?
,[
,]
,(
,)
и др.). - Символы Unicode:
\uXXXX
: Символ в формате Unicode.\xXX
: Символ в формате ASCII.\p{...}
: Классы Unicode (например,\p{L}
для букв).
10. Работа с регулярными выражениями
- Методы строк:
str.match(regexp)
: Возвращает совпадения илиnull
.str.matchAll(regexp)
: Итератор всех совпадений (работает только сg
).str.search(regexp)
: Индекс первого совпадения или-1
.str.replace(regexp, replacement)
: Замена совпадений.str.split(regexp)
: Разбиение строки.
- Методы RegExp:
regexp.test(str)
: Проверяет наличие совпадения (true
/false
).regexp.exec(str)
: Возвращает первое совпадение илиnull
.
11. Современные возможности
- Именованные группы:javascript
const regex = /(?<day>\d{2})-(?<month>\d{2})-(?<year>\d{4})/ const match = regex.exec('15-06-2023') console.log(match.groups.day) // "15"
- Unicode-свойства:javascript
const regex = /\p{Script=Greek}/u console.log(regex.test('α')) // true
- Lookbehind (задний просмотр):
(?<=...)
,(?<!...)
.
12. Практические примеры
- Поиск подстроки
js
const str = "Ваша заявка #223311";
const yourOrder = /Ваша заявка/;
str.test(yourOrder);
- Проверка номера телефона:javascript
const phoneRegex = /^\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,9}$/
- Валидация email:javascript
const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/