Сопоставление одинарных знаков и разбор математики с Regex - PullRequest
0 голосов
/ 03 июля 2011

Еще одна проблема с Regex, с которой мне нужна помощь.То, что я пытаюсь сделать, - это уметь анализировать математические выражения, в то время как мой Regex распознает унарные символы.Я использую следующее для синтаксического анализа целого числа:

[\+\-]?[0-9]+

, которое прекрасно работает в этих 2 сценариях:

myVar = -5
myVar = +5

Regex правильно определяет и -5, и +5 как целые числа.Моя проблема в том, что если у меня есть сценарий, подобный следующему:

myVar = 7-5

Это, однако, соответствует правильно:

myVar = 7*-5

Теперь, что Regex делает в сценарии 7-5, это егоидентифицируя 2 целых числа, 7 и -5.В действительности, я хочу, чтобы он мог идентифицировать целое число (7), знак минус (-) и затем другое целое число (5).Какой шаблон Regex мне нужен для этого?

Заранее спасибо.Кстати, это .NET Regex.

Ответы [ 3 ]

4 голосов
/ 03 июля 2011

Regex - не лучший выбор для разбора математических выражений.Посмотрите на Парсер рекурсивного спуска или Обратное польское обозначение или другой более подходящий алгоритм.

0 голосов
/ 10 августа 2017

При условии, что проблема ввода ограничена следующим образом:

  1. Максимум 1 бинарный оператор (*, /, +, -)
  2. макс. 2 унарных оператора (+, -)
  3. Все числа целые
  4. Без пробелов

Тогда будет работать следующее регулярное выражение:
(([\+\-]?[\d]+)([\+\-\*\/]))*([\+\-]?[\d]+)
(Игнорировать первую группу результатов.)

Если вы хотите рассмотреть пробелы, добавьте \s* в скобках:
(([\+\-]?[\d]+)\s*([\+\-\*\/]))*\s*([\+\-]?[\d]+)

Пример ввода и вывода (из групп 2-4):
Input \2 \3 \4 -5 -5 +5 +5 7-5 7 - 5 7*-5 7 * -5 -7*-5 -7 * -5

0 голосов
/ 03 июля 2011

Используйте это:

  ((\d)+[\+\-\*/])*

Затем используйте MatchCollection и Groups, чтобы получить желаемый результат.

...