Базовые символы и метасимволы

Базовые символы и метасимволы

Технический фундамент классов символов

Символьный класс в 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 в прод-валидации.