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

>console.log(quotedText.exec("she said 'hello'"));

>// → ["'hello'", "hello"]

Когда группа не найдена вообще (например, если за ней стоит знак вопроса), её позиция в массиве содержит >undefined. Если группа совпала несколько раз, то в массиве будет только последнее совпадение.

>console.log(/bad(ly)?/.exec("bad"));

>// → ["bad", undefined]

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

>// → ["123", "3"]

Группы полезны для извлечения частей строк. Если нам не просто надо проверить, есть ли в строке дата, а извлечь её и создать представляющий дату объект, мы можем заключить последовательности цифр в круглые скобки и выбрать дату из результата >exec.

Но для начала небольшое отступление, в котором мы узнаем предпочтительный способ хранения даты и времени в JavaScript.

Тип даты

В JavaScript есть стандартный тип объекта для дат – а точнее, моментов во времени. Он называется >Date. Если просто создать объект даты через >new, вы получите текущие дату и время.

>console.log(new Date());

>// → Sun Nov 09 2014 00:07:57 GMT+0300 (CET)

Также можно создать объект, содержащий заданное время

>console.log(new Date(2015, 9, 21));

>// → Wed Oct 21 2015 00:00:00 GMT+0300 (CET)

>console.log(new Date(2009, 11, 9, 12, 59, 59, 999));

>// → Wed Dec 09 2009 12:59:59 GMT+0300 (CET)

JavaScript использует соглашение, в котором номера месяцев начинаются с нуля, а номера дней – с единицы. Это глупо и нелепо. Поберегитесь.

Последние четыре аргумента (часы, минуты, секунды и миллисекунды) необязательны, и в случае отсутствия приравниваются к нулю.

Метки времени хранятся как количество миллисекунд, прошедших с начала 1970 года. Для времени до 1970 года используются отрицательные числа (это связано с соглашением по Unix time, которое было создано примерно в то время). Метод >getTime объекта даты возвращает это число. Оно, естественно, большое.

>console.log(new Date(2013, 11, 19).getTime());

>// → 1387407600000

>console.log(new Date(1387407600000));

>// → Thu Dec 19 2013 00:00:00 GMT+0100 (CET)

Если задать конструктору >Date один аргумент, он будет восприниматься как количество миллисекунд. Текущее значение миллисекунд можно получить, создав объект >Date и вызвав метод >getTime, или же вызвав функцию >Date.now.

У объекта >Date для извлечения его компонентов есть методы >getFullYear, >getMonth, >getDate, >getHours, >getMinutes, и >getSeconds. Есть также метод >getYear, возвращающий довольно бесполезный двузначный код, типа >93 или >14.

Заключив нужные части шаблона в круглые скобки, мы можем создать объект даты прямо из строки.

>function findDate(string) {

>  var dateTime = /(\d{1,2})-(\d{1,2})-(\d{4})/;