Выразительный JavaScript (Хавербеке) - страница 92

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

>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 = /\d\d-\d\d-\d\d\d\d \d\d:\d\d/;

>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

Повторяем части шаблона

Мы знаем, как найти одну цифру. А если нам надо найти число целиком – последовательность из одной или более цифр?

Если поставить после чего-либо в регулярке знак >+, это будет означать, что этот элемент может быть повторён более одного раза. >/\d+/ означает одну или несколько цифр.

>console.log(/'\d+'/.test("'123'"));

>// → true

>console.log(/'\d+'/.test("''"));

>// → false

>console.log(/'\d*'/.test("'123'"));

>// → true

>console.log(/'\d*'/.test("''"));

>// → true

У звёздочки >* значение почти такое же, но она разрешает шаблону присутствовать ноль раз. Если после чего-то стоит звёздочка, то оно никогда не препятствует нахождению шаблона в строке – оно просто находится там ноль раз.

Знак вопроса делает часть шаблона необязательной, то есть она может встретиться ноль или один раз. В следующем примере символ >u может встречаться, но шаблон совпадает и тогда, когда его нет.