Работа с числами может быть трудной. Этот подход будет иметь дело с вашими примерами, но проверьте внимательно. Я также не делал «все символы» в средней группе, так как «все» включало бы числа, поэтому вместо этого я предполагал, что поиск следующего не-числа будет уместным.
Это регулярное выражение Java обрабатывает требования:
"((-?)[\\d,.]+)([^\\d-]+)((-?)[\\d,.]+)"
Однако в приведенном выше описании есть потенциальная проблема. Учтите следующее:
300 - -200
. Вышеизложенное не будет соответствовать этому случаю.
Теперь, основываясь на примерах, я думаю, что дело в том, что нужно иметь действительный оператор. Количество математических операций, скорее всего, ограничено, поэтому я бы поставил белый список операторов посередине. Таким образом, что-то вроде:
"((-?)[\\d,.]+)([\\s]*[*/+-]+[\\s]*)((-?)[\\d,.]+)"
Я думаю, было бы более уместным. [*/+-]
может быть расширен для оператора ^
или любого другого. Теперь, если кто-то начнет добавлять слова (например, mod
) в уравнение, то выражение нужно будет изменить.
Вы можете увидеть это регулярное выражение здесь