Если поставить после чего-либо в регулярке знак +
, это будет означать, что этот элемент может быть повторён более одного раза. /\d+/
означает одну или несколько цифр.
console.log(/'\d+'/.test("'123'"));
// → true
console.log(/'\d+'/.test("''"));
// → false
console.log(/'\d*'/.test("'123'"));
// → true
console.log(/'\d*'/.test("''"));
// → true
У звёздочки *
значение почти такое же, но она разрешает шаблону присутствовать ноль раз. Если после чего-то стоит звёздочка, то оно никогда не препятствует нахождению шаблона в строке – оно просто находится там ноль раз.
Знак вопроса делает часть шаблона необязательной, то есть она может встретиться ноль или один раз. В следующем примере символ u
может встречаться, но шаблон совпадает и тогда, когда его нет.
var neighbor = /neighbou?r/;
console.log(neighbor.test("neighbour"));
// → true
console.log(neighbor.test("neighbor"));
// → true
Чтобы задать точное количество раз, которое шаблон должен встретиться, используются фигурные скобки. {4}
после элемента означает, что он должен встретиться в строке 4 раза. Также можно задать промежуток: {2,4}
означает, что элемент должен встретиться не менее 2 и не более 4 раз.
Ещё одна версия формата даты и времени, где разрешены дни, месяцы и часы из одной или двух цифр. И ещё она чуть более читаема.
var dateTime = /\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}/;
console.log(dateTime.test("30-1-2003 8:45"));
// → true
Можно использовать промежутки с открытым концом, опуская одно из чисел. {,5}
означает, что шаблон может встретиться от нуля до пяти раз, а {5,}
– от пяти и более.
Группировка подвыражений
Чтобы использовать операторы *
или +
на нескольких элементах сразу, можно использовать круглые скобки. Часть регулярки, заключённая в скобки, считается одним элементом с точки зрения операторов.
var cartoonCrying = /boo+(hoo+)+/i;
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.
Тип даты