В вашем шаблоне ^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$
вы хотите сопоставить необязательную точку, используя \d+\.?\d+
, которая работает, но теперь минимальное количество цифр для сопоставления равно 2 из-за совпадения 2 раз 1 или более цифр с использованием \d+
, поэтому 1 + 1не будет соответствовать.
Что бы вы могли сделать, если бы это были только простые вычисления, вы можете использовать 3 группы захвата и сопоставить цифру с необязательной десятичной частью, используя ?\d+(?:\.\d+)?
Ваш шаблон может выглядетьнапример:
^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$
Пояснение
^
Начало строки (-?\d+(?:\.\d+)?)
Группа захвата 1, соответствует 1+ цифрамс необязательной десятичной частью ([-+*\/])
Группа захвата 2, сопоставьте любой из перечисленных в классе символов (-?\d+(?:\.\d+)?)
Группа захвата 2, сопоставьте цифры 1+ с необязательной десятичной частью $
Конец строки
См. Демоверсию regex101
Например
var regex = /^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$/;
[
"21+22",
"7.01+9.05",
"1-1",
"1*1",
"0*1000000",
"8/4"
].forEach(x => {
var res = x.match(regex);
var left = res[1];
var right = res[2];
var sing = res[3];
console.log(left, right, sing);
});