Синтаксис регулярных выражений

Обычные символы, не имеющие специального значения, могут присутствовать в шаблоне и они будут трактоваться как есть. Пример указания в шаблоне последовательности обычных символов:

let p = /строка/;
console.log( p.test('строка') ); // true

Экранирование специальных символов

Внутри регулярного выражения символы ., ^, $, *, +, ?, {, [, ], \, |, ( и ) имеют специальное значение. Если эти символы должны трактоваться как есть, то их следует экранировать с помощью слэша. Некоторые специальные символы теряют свое специальное значение, если их разместить внутри квадратных скобок. В этом случае экранировать их не нужно. Например, метасимвол точка по умолчанию соответствует любому символу, кроме символа перевода строки. Если необходимо найти именно точку, то перед точкой необходимо указать символ \ или поместить точку внутри квадратных скобок ([.]). Продемонстрируем это на примере проверки правильности введенной даты (листинг 8.2).

Листинг 8.2. Проверка правильности введенной даты

let d = '24,10.2020';
// Неправильная дата (вместо точки указана запятая)
let p = /^[0-3][0-9].[01][0-9].[12][09][0-9][0-9]$/;
// Символ \ не указан перед точкой
if ( p.test(d) ) console.log('Дата введена правильно');
else console.log('Дата введена неправильно');
// Выведет Дата введена правильно, т. к. точка означает любой символ

p = /^[0-3][0-9]\.[01][0-9]\.[12][09][0-9][0-9]$/;
// Символ \ указан перед точкой
if ( p.test(d) ) console.log('Дата введена правильно');
else console.log('Дата введена неправильно');
// Выведет Дата введена неправильно,
// т. к. перед точкой указан символ \, а в дате присутствует запятая

p = /^[0-3][0-9][.][01][0-9][.][12][09][0-9][0-9]$/;
// Точка внутри квадратных скобок
if ( p.test(d) ) console.log('Дата введена правильно');
else console.log('Дата введена неправильно');
// Выведет Дата введена неправильно

p = new RegExp('^[0-3]\\d\\.[01]\\d\\.[12][09]\\d\\d$');
// Символ \ указан перед точкой
if ( p.test(d) ) console.log('Дата введена правильно');
else console.log('Дата введена неправильно');
// Выведет Дата введена неправильно

Следует учитывать, что символ обратного слеша является специальным не только в шаблоне регулярного выражения, но и в строке. Поэтому его нужно экранировать при создании шаблона с помощью класса RegExp. Обратите внимание на регулярное выражение в последнем примере:

'^[0-3]\\d\\.[01]\\d\\.[12][09]\\d\\d$'

Внутри шаблона регулярного выражения комбинация символов \d является специальной и обозначает любые цифры. В строке символ \ должен заменяться на \\. Поэтому вместо \d указано \\d, а вместо \. — \\..

Чтобы не нужно было экранировать специальные символы в строке, следует использовать неформатированные строки (см. разд. 7.4):

let d = '24,10.2020';
p = new RegExp( String.raw`^[0-3]\d\.[01]\d\.[12][09]\d\d$` );
if ( p.test(d) ) console.log('Дата введена правильно');
else console.log('Дата введена неправильно');
// Выведет Дата введена неправильно

Метасимвол точка теряет свое специальное значение, если его заключить в квадратные скобки. Кроме того, внутри квадратных скобок могут встретиться символы, которые имеют специальное значение (например, ^ и -). Символ ^ теряет свое специальное значение, если он не расположен сразу после открывающей квадратной скобки:

let p = /[09^]/g;            // 0, 9 или ^
let str = '0123456789^';
console.log( str.match(p) ); // [ '0', '9', '^' ]

Чтобы отменить специальное значение символа -, его необходимо указать после перечисления всех символов, перед закрывающей квадратной скобкой:

let p = /[09-]/g;            // 0, 9 или -
let str = '0123456789-';
console.log( str.match(p) ); // [ '0', '9', '-' ]

Все специальные символы можно сделать обычными, если перед ними указать символ \:

let p = /[0\-9]/g;           // 0, - или 9
let str = '0123456789-';
console.log( str.match(p) ); // [ '0', '9', '-' ]

Символ / в регулярном выражении, ограниченном символами /, также является специальным, поэтому его нужно экранировать:

let p = /[0\/9]/g;           // 0, / или 9
let str = '0123456789-/';
console.log( str.match(p) ); // [ '0', '9', '/' ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов