Базовые символы и метасимволы
Базовые символы и метасимволы
Технический фундамент классов символов
Символьный класс в regex всегда матчит ровно один символ из набора:
[abc]- один из перечисленных;[^abc]- любой, кроме перечисленных;- диапазоны (
[0-9],[A-Z]) задают интервалы; - escape внутри класса тоже важен (например,
[\]]для]).
Поэтому при проектировании шаблона полезно четко понимать: что разрешено, что запрещено, и матчим ли мы один символ или последовательность.
Почему без метасимволов regex почти бесполезен
Если использовать regex только для точного текста (/cat/), это мало отличается от includes. Сила регулярных выражений раскрывается, когда ты описываешь классы символов: цифры, пробелы, границы слов, любые символы.
Ключевой момент: метасимволы позволяют задавать правило, а не перечислять все варианты вручную.
Проверь себя: почему проще написать \d вместо проверки каждой цифры по отдельности?
Базовые метасимволы, которые нужно знать
.- любой один символ;\d- цифра (0-9);\D- не цифра;\w- "символ слова" (a-z,A-Z,0-9,_);\W- не\w;\s- пробельный символ;\S- не пробельный символ.
console.log(/\d/.test('A7')); // true
console.log(/\D/.test('7')); // false
console.log(/\w/.test('_')); // true
console.log(/\s/.test(' ')); // true
Смотри, что важно: заглавная версия (\D, \W, \S) обычно означает "противоположность".
Смотри, что важно: \s это не только обычный пробел. Туда попадают табы и переводы строк, поэтому \s+ часто "схлопывает" сразу и пробелы, и переносы.
Экранирование специальных символов
Некоторые символы в regex имеют специальный смысл: ., +, *, ?, (, ), [, ], {, }, |, ^, $, \.
Если хочешь искать их как обычный текст, нужно экранировать через \.
console.log(/\./.test('3.14')); // true (ищем точку)
console.log(/./.test('3.14')); // true (любой символ)
Здесь часто путаются: . и \. это разные вещи.
Проверь себя: какой шаблон найдет символ + в строке C++?
Символьные классы [ ... ]
[abc] означает "один символ: a или b или c".
console.log(/[abc]/.test('dog')); // false
console.log(/[abc]/.test('cat')); // true
Отрицание класса: [^abc] - любой символ, кроме a, b, c.
console.log(/[^0-9]/.test('123')); // false
console.log(/[^0-9]/.test('12A')); // true
Это удобно для первичной фильтрации некорректных символов.
Смотри, что важно: внутри [ ... ] некоторые символы имеют особое значение:
-задает диапазон ([0-9]). Чтобы матчить обычный дефис, помести его в начало/конец класса или экранируй:[-a-z],[a-z-],[\\-].^в самом начале означает "НЕ" ([^0-9]). Чтобы матчить^как символ, ставь его не первым или экранируй:[a^]или[\\^].]закрывает класс, поэтому для символа]обычно пишут[]]или[\]].
console.log(/^[A-Z-]+$/.test('AB-CD')); // true
console.log(/^[A-Z-]+$/.test('AB+CD')); // false
console.log(/[\^]/.test('^')); // true
Диапазоны внутри классов
Внутри [ ... ] можно задавать диапазоны:
[0-9]- цифры;[a-z]- латиница в нижнем регистре;[A-Z]- верхний регистр.
const skuRegex = /^[A-Z0-9_]+$/;
console.log(skuRegex.test('AB_100')); // true
console.log(skuRegex.test('ab_100')); // false
Дополнительный пример: фильтрация строки по разрешенному набору символов.
const raw = 'SKU: AB-100!';
const clean = raw.replace(/[^A-Z0-9_]/gi, '');
console.log(clean); // SKUAB100
Мини-сценарий: проверка кода товара, где разрешены только большие буквы, цифры и _.
Частые ошибки новичков
- Забывать экранирование и получать неожиданные совпадения.
- Путать
\wс "все буквы всех языков" (по умолчанию это ограниченный набор). - Использовать
.там, где нужен конкретный символ. - Не проверять поведение на пробелах и табах (
\s).
Анти-провал: при первом запуске шаблона всегда прогоняй 3-5 входов: валидный, невалидный, пустой, с пробелом, с неожиданным символом.
Что будет, если изменить входные данные
Если шаблон ^[A-Z0-9_]+$ получает AB_100, он пройдет. Если AB-100, не пройдет из-за -. Если AB_100, не пройдет из-за пробела. Так ты держишь формат данных под контролем.
Проверь себя: как изменится результат, если добавить флаг i к этому шаблону?
Краткий итог
- Метасимволы (
\d,\w,\sи др.) позволяют описывать классы символов. - Экранирование (
\.) критично, когда ищешь спецсимвол как текст. - Символьные классы
[ ... ]и диапазоны дают гибкий контроль формата. - Ошибки чаще всего связаны с неверным пониманием
.и экранирования. - Проверка edge case обязательна перед использованием regex в прод-валидации.