Выбрать главу

/x+?/ Одно или более вхождений, нежадное

/x*/ Ноль или более вхождений

/x?/ Ноль или одно вхождение

/x{2,4}/ От двух до четырёх вхождений

/(abc)/ Группа

/a|b|c/ Любой из нескольких шаблонов

/\d/ Любая цифра

/\w/ Любой алфавитно-цифровой символ («буква»)

/\s/ Любой пробельный символ

/./ Любой символ, кроме переводов строки

/\b/ Граница слова

/^/ Начало строки

/$/ Конец строки

У регулярки есть метод test, для проверки того, есть ли шаблон в строке. Есть метод exec, возвращающий массив, содержащий все найденные группы. У массива есть свойство index, показывающее, где начался поиск.

У строк есть метод match для поиска шаблонов, и метод search, возвращающий только начальную позицию вхождения. Метод replace может заменять вхождения шаблона на другую строку. Кроме этого, вы можете передать в replace функцию, которая будет строить строчку на замену, основываясь на шаблоне и найденных группах.

У регулярок есть настройки, которые пишут после закрывающего слэша. Опция i делает регулярку регистронезависимой, а опция g делает её глобальной, что, кроме прочего, заставляет метод replace заменять все найденные вхождения, а не только первое.

Конструктор RegExp можно использовать для создания регулярок из строк.

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

Упражнения

Неизбежно при решении задач у вас возникнут непонятные случаи, и вы можете иногда отчаиваться, видя непредсказуемое поведение некоторых регулярок. Иногда помогает изучить поведение регулярки через онлайн-сервис типа debuggex.com, где можно посмотреть её визуализацию и сравнить с желаемым эффектом.

Регулярный гольф

«Гольфом» в коде называют игру, где нужно выразить заданную программу минимальным количеством символов. Регулярный гольф – практическое упражнение по написанию наименьших возможных регулярок для поиска заданного шаблона, и только его.

Для каждой из подстрочек напишите регулярку для проверки их нахождения в строке. Регулярка должна находить только эти указанные подстроки. Не волнуйтесь насчёт границ слов, если это не упомянуто особо. Когда у вас получится работающая регулярка, попробуйте её уменьшить.

1 car и cat

2 pop и prop

3 ferret, ferry, и ferrari

4 Любое слово, заканчивающееся на ious

5 Пробел, за которым идёт точка, запятая, двоеточие или точка с запятой.

6 Слово длиннее шести букв

7 Слово без букв e

// Впишите свои регулярки

verify(/.../,

       ["my car", "bad cats"],

       ["camper", "high art"]);

verify(/.../,

       ["pop culture", "mad props"],

       ["plop"]);

verify(/.../,

       ["ferret", "ferry", "ferrari"],

       ["ferrum", "transfer A"]);

verify(/.../,

       ["how delicious", "spacious room"],

       ["ruinous", "consciousness"]);

verify(/.../,

       ["bad punctuation ."],

       ["escape the dot"]);

verify(/.../,

       ["hottentottententen"],

       ["no", "hotten totten tenten"]);

verify(/.../,

       ["red platypus", "wobbling nest"],

       ["earth bed", "learning ape"]);

function verify(regexp, yes, no) {

  // Ignore unfinished exercises

  if (regexp.source == "...") return;

  yes.forEach(function(s) {

    if (!regexp.test(s))

      console.log("Не нашлось '" + s + "'");

  });

  no.forEach(function(s) {

    if (regexp.test(s))

      console.log("Неожиданное вхождение '" + s + "'");

  });

}

Кавычки в тексте

Допустим, вы написали рассказ, и везде для обозначения диалогов использовали одинарные кавычки. Теперь вы хотите заменить кавычки диалогов на двойные, и оставить одинарные в сокращениях слов типа aren’t.

Придумайте шаблон, различающий два этих использования кавычек, и напишите вызов метода replace, который производит замену.