> 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"
. Совпадение может случиться в любом месте строки, так что в данном случае он просто начнёт со второго символа и закончит на предпоследнем.
Если нам надо принудить совпадение взять всю строку целиком, мы используем метки >^
и >$
. >^
совпадает с началом строки, а >$
– с концом. Поэтому >/^\d+$/
совпадает со строкой, состоящей только из одной или нескольких цифр, >/^!/
совпадает со строкой, начинающейся с восклицательного знака, а >/x^/
не совпадает ни с какой строчкой (перед началом строки не может быть >x
).
Если, с другой стороны, нам просто надо убедиться, что дата начинается и заканчивается на границе слова, мы используем метку >\b
. Границей слова может быть начало или конец строки, или любое место строки, где с одной стороны стоит алфавитно-цифровой символ >\w
, а с другой – не алфавитно-цифровой.
>console.log(/cat/.test("concatenate"));
>// → true
>console.log(/\bcat\b/.test("concatenate"));
>// → false
Отметим, что метка границы не представляет из себя символ. Это просто ограничение, обозначающее, что совпадение происходит только если выполняется определённое условие.
Допустим, надо выяснить, содержит ли текст не просто номер, а номер, за которым следует pig, cow, или chicken в единственном или множественном числе.
Можно было бы написать три регулярки и проверить их по очереди, но есть способ лучше. Символ >|
обозначает выбор между шаблонами слева и справа от него. И можно сказать следующее:
>var animalCount = /\b\d+ (pig|cow|chicken)s?\b/;
>console.log(animalCount.test("15 pigs"));
>// → true
>console.log(animalCount.test("15 pigchickens"));
>// → false
Скобки ограничивают часть шаблона, к которой применяется |, и можно поставить много таких операторов друг за другом, чтобы обозначить выбор из более чем двух вариантов.
Регулярные выражения можно рассматривать как блок-схемы. Следующая диаграмма описывает последний животноводческий пример.
Выражение совпадает со строкой, если можно найти путь с левой части диаграммы в правую. Мы запоминаем текущее положение в строке, и каждый раз, проходя прямоугольник, проверяем, что часть строки сразу за нашим положением в ней совпадает с содержимым прямоугольника.
Значит, проверка совпадения нашей регулярки в строке