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

>  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

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

Механизм поиска

Регулярные выражения можно рассматривать как блок-схемы. Следующая диаграмма описывает последний животноводческий пример.



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

Значит, проверка совпадения нашей регулярки в строке