Книга: Выразительный JavaScript

Ищем набор символов

Ищем набор символов

Выяснить, содержит ли строка abc, можно было бы и при помощи indexOf. Регулярки позволяют пройти дальше и составлять более сложные шаблоны.

Допустим, нам надо найти любой номер. Когда мы в регулярке помещаем набор символов в квадратные скобки, это означает, что эта часть выражения совпадает с любым из символов в скобках.

Оба выражения находятся в строчках, содержащих цифру.

console.log(/[0123456789]/.test("in 1992"));
// ? true
console.log(/[0-9]/.test("in 1992"));
// ? true

В квадратных скобках тире между двумя символами используется для задания диапазона символов, где последовательность задаётся кодировкой Unicode. Символы от 0 до 9 находятся там просто подряд (коды с 48 до 57), поэтому [0-9] захватывает их все и совпадает с любой цифрой.

У нескольких групп символов есть свои встроенные сокращения:

d – любая цифра

w – алфавитно-цифровой символ

s – пробельный символ (пробел, табуляция, перевод строки, и т. п.)

D – не цифра

W – не алфавитно-цифровой символ

S – не пробельный символ

. – любой символ, кроме перевода строки

Таким образом можно задать формат даты и времени вроде 30-01-2003 15:20 следующим выражением:

var dateTime = /dd-dd-dddd dd:dd/;
console.log(dateTime.test("30-01-2003 15:20"));
// ? true
console.log(dateTime.test("30-jan-2003 15:20"));
// ? false

Выглядит ужасно, не так ли? Слишком много обратных слэшей, которые затрудняют понимание шаблона. Позже мы слегка улучшим его.

Обратные слэши можно использовать и в квадратных скобках. Например, [d.] означает любую цифру или точку. Заметьте, что точка внутри квадратных скобок теряет своё особое значение и превращается просто в точку. То же касается и других специальных символов, типа +.

Инвертировать набор символов – то есть, сказать, что вам надо найти любой символ, кроме тех, что есть в наборе – можно, поставив знак ^ сразу после открывающей квадратной скобки.

var notBinary = /[^01]/;
console.log(notBinary.test("1100100010100110"));
// ? false
console.log(notBinary.test("1100100010200110"));
// ? true

Оглавление книги


Генерация: 0.951. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз