Регулярное выражение, которое вы ищете, выглядит примерно так:
-?\d+(?:\.\d+)?([*/%+-]-?\d+(?:\.\d+)?)+
В основном это означает:
NUMBER (OPER NUMBER)*
Число определяется как:
- Необязательный знак минус;
- Одна или несколько цифр;
- При желании точка, за которой следуют одна или несколько цифр.
Теперь ведущий опциональный минус не совсем соответствует вашим требованиям, поэтому вы можете спокойно отбросить его, но без него вы не сможете распознать:
-3*-4
что нарушает ваше состояние двух операндов вместе. Чтобы отбросить его, просто удалите -?
из выражения (в обоих местах), то есть:
\d+(?:\.\d+)?([*/%+-]\d+(?:\.\d+)?)+
Также неясно, хотите ли вы принять много операндов или только один. Если это только один, то:
-?\d+(?:\.\d+)?[*/%+-]-?\d+(?:\.\d+)?
или
\d+(?:\.\d+)?[*/%+-]\d+(?:\.\d+)?
или вариант, допускающий пробелы (\s
). Возможно, вы также захотите захватить группы, используя скобки.
Возможно, вы захотите изменить это определение.
Также вы можете рассмотреть вопрос о разрешении пробелов между числами и операндами.
Пример использования:
var s = "-11.32 * -34";
var r = /(-?\d+(?:\.\d+)?)\s*([*/%+-])\s*(-?\d+(?:\.\d+)?)/;
var m = r.exec(s);
if (m != null) {
alert("First: " + m[1] + "\nOperand: " + m[2] + "\nSecond: " + m[3]);
} else {
alert("Not found");
}