Регулярное выражение для числа, возможно, дробного и отрицательного: -?\d+(\.\d+)?
. Мы уже разбирали его в предыдущих задачах.
Оператор -- это [-+*/]
. Заметим, что дефис -
идёт в списке первым, так как на любой позиции, кроме первой и последней, он имеет специальный смысл внутри [...]
, и его понадобилось бы экранировать.
Кроме того, когда мы оформим это в JavaScript-синтаксис /.../
-- понадобится заэкранировать слэш /
.
Нам нужно число, затем оператор, затем число, и необязательные пробелы между ними.
Полное регулярное выражение будет таким: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?
.
Чтобы получить результат в виде массива, добавим скобки вокруг тех данных, которые нам интересны, то есть -- вокруг чисел и оператора: (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?)
.
Посмотрим в действии:
```js
//+ run
var re = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(re) );
```
Итоговый массив будет включать в себя компоненты:
?:
, то есть: (?:\.\d+)?
.
Итого, решение:
```js
//+ run
function parse(expr) {
var re = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
var result = expr.match(re);
if (!result) return;
result.shift();
return result;
}
alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45
```