дужкові групи

Частина шаблону може бути укладена в дужки (.). Такі виділені частини шаблону називають «Дужковий виразами» або «Дужковий групами».

У такого виділення є два ефекту:

  1. Він дозволяє виділити частину збіги в окремий елемент масиву при пошуку через String # match або RegExp # exec.
  2. Якщо поставити квантіфікатор після дужки, то він таким чином, застосовується до всієї скобці. а не лише до одного символу.

У прикладі нижче, шаблон (go) + знаходить один або більше повторюваних 'go':

Без дужок, шаблон / go + / означав би g. після якого йде одна або більше o. наприклад: goooo. А дужки «групують» (go) разом.

Дужки нумеруються зліва направо. Пошукової движок запам'ятовує вміст кожної дужки і дозволяє звертатися до нього - в шаблоні і рядку заміни і, звичайно ж, в результатах.

Наприклад, знайти HTML-тег можна шаблоном <.*?> .

Після пошуку ми захочемо щось зробити з результатом. Для зручності укладемо вміст <.> в дужки: <(.*?)>. Тоді воно буде доступно окремо.

При пошуку методом String # match в результуючому масиві буде спочатку все збіг, а далі - дужкові групи. У шаблоні <(.*?)> Дужковий група тільки одна:

Зауважимо, що метод String # match видає дужкові групи тільки при пошуку без прапора /. / G. В наведеному вище прикладі він знайшов тільки перший збіг не знайшов, оскільки без прапора /. / G шукається тільки перший збіг.

Для того, щоб шукати і з прапором /. / G і зі Дужковий групами, використовується метод RegExp # exec:

Арифметичний вираз складається з двох чисел і операції між ними, наприклад:

Список операцій: "+". "-". "*" І "/".

Також можуть бути присутніми прогалини навколо оператора і чисел.

Напишіть функцію, яка буде отримувати вираз і повертати масив з трьох аргументів:

  1. Перше число.
  2. Оператор.
  3. Друге число.
Рішення

Регулярний вираз для числа, можливо, дрібного і негативного: -? \ D + (\. \ D +). Ми вже розбирали його в попередніх завданнях.

Оператор - це [- + * /]. Зауважимо, що дефіс - йде в списку першим, так як на будь-якій позиції, окрім першої і останньої, він має спеціальний сенс усередині [. ]. і його треба було б екранувати.

Нам потрібно число, потім оператор, потім число, і необов'язкові прогалини між ними.

Повний регулярний вираз буде таким: -? \ D + (\. \ D +)? \ S * [- + * /] \ s * -? \ D + (\. \ D +).

Щоб отримати результат у вигляді масиву, додамо дужки навколо тих даних, які нам цікаві, тобто - навколо чисел і оператора: (-? \ D + (\. \ D +)?) \ S * ([- + * /]) \ s * (-? \ d + (\. \ d +)?).

Подивимося в дії:

Підсумковий масив буде включати в себе компоненти:

  • result [0] == "1.2 + 12" (спочатку завжди повний збіг)
  • result [1] == "1" (перша дужка)
  • result [2] == "2" (друга дужка - дрібна частина (\. \ d +)?)
  • result [3] == "+" (...)
  • result [4] == "12" (...)
  • result [5] == undefined (остання дужка, але у другого числа дрібна частина відсутня)

Нам з цього масиву потрібні тільки числа і оператор. А, скажімо, дрібна частина сама по собі - не потрібна.

Приберемо її з запам'ятовування, додавши в початок дужки. тобто: (?: \. \ d +).