Регулярные выражения (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,}$/