console.log(cartoonCrying.test("Boohoooohoohooo"));
// → true
Первый и второй плюсы относятся только ко вторым буквам o
в словах boo
и hoo
. Третий +
относится к целой группе ( hoo+
), находя одну или несколько таких последовательностей.
Буква i
в конце выражения делает регулярку нечувствительной к регистру символов – так, что B
совпадает с b
.
Метод test
– самый простой метод проверки регулярок. Он только сообщает, было ли найдено совпадение, или нет. У регулярок есть ещё метод exec
, который вернёт null
, если ничего не было найдено, а в противном случае вернёт объект с информацией о совпадении.
var match = /\d+/.exec("one two 100");
console.log(match);
// → ["100"]
console.log(match.index);
// → 8
У возвращаемого exec
объекта есть свойство index
, где содержится номер символа, с которого случилось совпадение. А вообще объект выглядит как массив строк, где первый элемент – строка, которую проверяли на совпадение. В нашем примере это будет последовательность цифр, которую мы искали.
У строк есть метод match
, работающий примерно так же.
console.log("one two 100".match(/\d+/));
// → ["100"]
Когда в регулярке содержатся подвыражения, сгруппированные круглыми скобками, текст, совпавший с этими группами, тоже появится в массиве. Первый элемент всегда совпадение целиком. Второй – часть, совпавшая с первой группой (той, у кого круглые скобки встретились раньше всех), затем со второй группой, и так далее.
var quotedText = /'([^']*)'/;
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})/;
var match = dateTime.exec(string);
return new Date(Number(match[3]),
Number(match[2]) - 1,
Number(match[1]));
}
console.log(findDate("30-1-2003"));
// → Thu Jan 30 2003 00:00:00 GMT+0100 (CET)
К сожалению, findDate
так же радостно извлечёт бессмысленную дату 00-1-3000 из строки "100-1-30000"
. Совпадение может случиться в любом месте строки, так что в данном случае он просто начнёт со второго символа и закончит на предпоследнем.
Читать дальше