Как создать сайт

Скобочные группы в регулярных выражениях

Здравствуйте! В этом уроке мы с вами разберемся что такое скобочные группы в регулярных выражениях и зачем они нужны. Вы можете какую-то часть шаблона регулярного выражения заключить  (…). Вот такие  части шаблона и называют  «скобочными выражениями» или «скобочными группами».

У них есть 2  преимущества.

  1. Позволяет выделить часть совпадения в элемент массива при поиске через методы регулярных выражений.
  2. А вот если поставить квантификатор после скобки, то он будет применяться  ко всей скобке,  а не к одному символу.

Скобочные группы в регулярных выражениях

 

 

Рассмотрим пример  шаблон (get)+ находит один или более повторяющихся ‘get’:

alert( 'Getgetget now!'.match(/(get)+/i) ); // "Getgetget"

Без скобок же, шаблон /get+/ указывал  бы на  g, после которого идёт одна или более et, например: geetttt. А скобки раз и группируют (get) вместе.

Содержимое группы

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

Например,  для того чтобы найти  HTML-тег используется вот такой  шаблон <.*?>.

Если вы захотите что-то сделать с результатом, то тогда можно заключить содержимое <…> в скобки: <(.*?)>. Тогда оно вам  будет доступно отдельно.

При поиске методом match в массиве будет сначала всё совпадение, а далее – скобочные группы. В шаблоне <(.*?)> скобочная группа только 1:

var str1 = '<h1>Привет, JavaScript!</h1>';
var reg1 = /<(.*?)>/;

alert( str1.match(reg1) ); // массив: <h1>, h1

Следует заметить, что  метод match  может выдавать скобочные группы только при поиске без флага /…/g.

Для того, чтобы  была возможность искать и с флагом /…/g и со скобочными группами, используется метод exec:

var str1 = '<h1>Привет, Javascript!</h1>';
var reg1 = /<(.*?)>/g;

var match1;

while ((match1 = reg1.exec(str1)) !== null) {
  // сначала  первое совпадение: <h1>,h1
  // затем  второе совпадение: </h1>,/h1
  alert(match1);
}

Теперь  как видно найдено 2 совпадения <(.*?)>.

Читайте также  Альтернация в регулярных выражениях

Вложенные скобочные группы

Скобки также  могут быть и вложенными. В таком случае нумерация идёт слева направо.

Например, при поиске тега в <div class=”my”> нас может интересовать:

  1. Содержимое тега целиком: div class=”my”.
  2. А вот в  отдельную переменную хотелось бы поместить тег: div.
  3. Также для удобства можно отдельно выделить атрибуты class=”my”.

Давайте добавим скобки в регулярное выражение:

var str1 = '<div class="my">';

var reg1 = /<(([a-z]+)\s*([^>]*))>/;

alert( str1.match(reg1) ); // <div class="my">, div class="my", div, class="my"

Давайте разберем по подробнее скобочные группы.

На нулевом месте – идет  всегда полное  совпадение, далее –  следуют группы. Нумерация всегда будет идти  слева направо, по открывающей скобке.

В нашем случае группа 1 включает в себя также и  содержимое групп 2 и 3. Это нормальная ситуация, которая  может возникать, когда  вам нужно выделить что-то отдельное внутри  одной большей группы.

Для примера, рассмотрим регулярку a(b)?(d)?. Она ищет “a”, за которой не обязательно идёт буква “b”, за которой необязательно идёт буква “d”.

Если применить его на строку из одной буквы “a”, то получим:

var match = 'a'.match(/a(b)?(d)?/)
alert( match.length ); // 3
alert( match[0] ); // a
alert( match[1] ); // undefined
alert( match[2] ); // undefined

Как видите массив получился длиной 3, но при этом все скобочные группы – undefined.

Исключение из запоминания через ?:

Иногда случается так, что скобки нужны, чтобы квантификатор правильно применился, а вот в массиве эта группа не нужна.

Для того чтобы исключить скобочную группу из массива  нужно просто в начало этой группы добавить  ?:.

Для примера вы хотите найти (gu)+, но вот  содержимое скобок (gu) в массив  записывать не хотим.

Для этого надо  сразу же после открывающей скобки поставить ?:  (?:gu)+.

Читайте также  Квантификаторы регулярных выражений

Например:

var str1 = "Gogo John!";
var reg1 = /(?:go)+ (\w+)/i;
var result1 = str1.match(reg);
alert( result1.length ); // 2
alert( result1[1] ); // John
В данном примере массив результатов будет  иметь  длину 2 и содержать  только полное совпадение и результат (\w+).  Это может пригодиться когда содержимое скобок нас не интересует.

ИТОГИ

Скобочные группы нужны для группировки

Задачи

Найдите цвет в формате #abc 

Вам надо написать  регулярное выражение, которое  сможет находить цвет в формате #abc.

var re1 = /* ваш регэксп */

var str1 = "color: #3f5; background-color: #AA00eа; and: #abcd";

alert( str1.match(re1) ); // #3f3 #AA0ef

Разобрать выражение

Арифметическое выражение состоит из двух чисел и операции между ними, например:

  • 1 + 4
  • 1.2 * 3.6
  • -3 / -8
  • -2 – 2

Список операций: “+”, “-“, “*” и “/”. Также допускаются пробелы вокруг оператора и чисел. Вам надо написать  функцию, которая будет получать  на вход выражение и возвращать массив из 3 аргументов:

  1. Первое число.
  2. Оператор.
  3. Второе число.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Плюсануть
Поделиться
Понравилась запись? Подпишитесь на обновления по почте:

Об авторе

admin administrator

Оставить ответ

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: