дужкові групи
Частина шаблону може бути укладена в дужки (.). Такі виділені частини шаблону називають «Дужковий виразами» або «Дужковий групами».
У такого виділення є два ефекту:
- Він дозволяє виділити частину збіги в окремий елемент масиву при пошуку через String # match або RegExp # exec.
- Якщо поставити квантіфікатор після дужки, то він таким чином, застосовується до всієї скобці. а не лише до одного символу.
У прикладі нижче, шаблон (go) + знаходить один або більше повторюваних 'go':
Без дужок, шаблон / go + / означав би g. після якого йде одна або більше o. наприклад: goooo. А дужки «групують» (go) разом.
Дужки нумеруються зліва направо. Пошукової движок запам'ятовує вміст кожної дужки і дозволяє звертатися до нього - в шаблоні і рядку заміни і, звичайно ж, в результатах.
Наприклад, знайти HTML-тег можна шаблоном <.*?> .
Після пошуку ми захочемо щось зробити з результатом. Для зручності укладемо вміст <.> в дужки: <(.*?)>. Тоді воно буде доступно окремо.
При пошуку методом String # match в результуючому масиві буде спочатку все збіг, а далі - дужкові групи. У шаблоні <(.*?)> Дужковий група тільки одна:
Зауважимо, що метод String # match видає дужкові групи тільки при пошуку без прапора /. / G. В наведеному вище прикладі він знайшов тільки перший збіг не знайшов, оскільки без прапора /. / G шукається тільки перший збіг.
Для того, щоб шукати і з прапором /. / G і зі Дужковий групами, використовується метод RegExp # exec:
Арифметичний вираз складається з двох чисел і операції між ними, наприклад:
Список операцій: "+". "-". "*" І "/".
Також можуть бути присутніми прогалини навколо оператора і чисел.
Напишіть функцію, яка буде отримувати вираз і повертати масив з трьох аргументів:
- Перше число.
- Оператор.
- Друге число.
Регулярний вираз для числа, можливо, дрібного і негативного: -? \ 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 +).