Разобрать выражение
Арифметическое выражение включает два числа и оператор между ними. Например:
1 + 21.2 * 3.4-3 / -6-2 - 2
Оператором может быть: "+", "-", "*" или "/".
В выражении могут быть пробелы в начале, в конце или между частями выражения.
Создайте функцию parse(expr), которая принимает выражение и возвращает массив из трёх элементов:
- Первое число.
- Оператор.
- Второе число.
Например:
let [a, op, b] = parse("1.2 * 3.4");
alert(a); // 1.2
alert(op); // *
alert(b); // 3.4
Регулярное выражение для числа: -?\d+(\.\d+)?. Мы создали его в предыдущих задачах.
Регулярное выражение для оператора [-+*/]. Дефис - стоит в начале квадратных скобок, потому что в середине этот символ будет означать диапазон, а нам нужен просто символ -.
Отметим, что косая черта должна быть экранирована внутри регулярного выражения JavaScript /.../.
Нам необходимо число, оператор и, затем, другие числа. Между ними могут быть необязательные пробелы.
Полное выражение: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?.
Оно состоит из трёх частей, между которыми стоит \s*:
-?\d+(\.\d+)?– первое число,[-+*/]– оператор,-?\d+(\.\d+)?– второе число.
Для получения этих частей в виде отдельных элементов массива-результата давайте вставим скобки вокруг каждой из них, получится (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?).
В действии:
let regexp = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(regexp) );
Результат result включает в себя:
result[0] == "1.2 + 12"(полное совпадение)result[1] == "1.2"(первая группа(-?\d+(\.\d+)?)– первое число, включая десятичную часть)result[2] == ".2"(вторая группа(\.\d+)?– первая десятичная часть)result[3] == "+"(третья группа([-+*\/])– оператор)result[4] == "12"(четвёртая группа(-?\d+(\.\d+)?)– второе число)result[5] == undefined(пятая группа(\.\d+)?– вторая десятичная часть отсутствует, поэтому значениеundefined)
Нам необходимы только числа и оператор без полного совпадения или десятичной части, поэтому давайте «почистим» этот результат.
Первый элемент массива (полное совпадение) можно удалить при помощи сдвига массива result.shift().
Группы, которые содержат десятичную часть (номер 2 и 4) (.\d+) можно убрать из массива, добавив ?: в начало: (?:\.\d+)?.
Итоговое решение:
function parse(expr) {
let regexp = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
let result = expr.match(regexp);
if (!result) return [];
result.shift();
return result;
}
alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45