Регулярное выражение для простой арифметической строки - PullRequest
1 голос
/ 23 февраля 2011

Я пытаюсь проверить простое арифметическое выражение, чтобы убедиться, что оно вписывается в операнд оператора формата: 234.34 + 5. Я выяснил, как проверить это достаточно просто, но я хочу, чтобы пользователи могли продолжать вводить большечем 2 значения, такие как: 234,34 + 5/6 * 7 - -34.Пока что мое регулярное выражение выглядит следующим образом:

[-]*\d+[.\d+[E\d+]*]*[\s+[*+/-]\s+[-]*\d+[.\d+[E\d+]*]*]*

Это частично работает, но у меня проблема в том, что я допускаю некоторые странные вещи, которые мне не нужны, такие как -4.34.1 - 34 +

Есть предложения?

Ответы [ 5 ]

5 голосов
/ 23 февраля 2011

Попробуй это. Это ужасно, но это должно сработать (если вы не используете круглые скобки):

-?\d+(?:\.\d+(?:E\d+)?)?(\s*[-+/\*]\s+-?\d+(?:\.\d+(?:E\d+)?)?)+

Объяснение

Это будет математическое число, за которым следует оператор, и число неопределенно

  • -?\d+(?:\.\d+(?:E\d+)?)? Совпадение числа
  • (
    • \s* необязательные пробелы
    • [-+/\*] любой оператор: +, -, *, /
    • \s+ хотя бы один пробел (чтобы избежать --b)
    • -?\d+(?:\.\d+(?:E\d+)?)? соответствует другому номеру
  • )+ повторите этот блок один или несколько раз

И числовое выражение:

  • -? опционально -
  • \d+ цифр (одна или несколько)
  • (?: начало дополнительной части
    • \. точка
    • \d+ цифры
    • (?: начало дополнительной части научной нотации
      • E match E char
      • \d+ цифра совпадения
    • )? закрытие факультативной части научного нотариуса
  • )? закрыть необязательную группу

Но я настоятельно рекомендую написать для этого правильный синтаксический анализатор, он также позволит поддерживать скобки: a + (b + c).

4 голосов
/ 23 февраля 2011

Я ненавижу быть "тем парнем", но почему бы просто не написать простой валидатор, который анализирует строку без использования регулярных выражений? В чем причина использования регулярных выражений для этого? Если бы вы написали свой собственный синтаксический анализатор, решение не только было бы легче понять и поддерживать, но и немного потрудившись, вы также сможете оценить выражение.

1 голос
/ 23 июля 2011

я выпустил средство оценки выражений, основанное на алгоритме Shijnting Yard Дейкстры на условиях Apache License 2.0 :

http://projects.congrace.de/exp4j/index.html

1 голос
/ 23 февраля 2011

Лучше всего просто написать парсер. Я знаю, это звучит страшно, но на самом деле это домашнее задание второго курса в колледже.

См. Алгоритм Дейкстры Маневровый двор . Это позволит вам как проверить, так и оценить выражение, поэтому, если вы собираетесь использовать этот проект, вам придется его реализовать в любом случае ...

0 голосов
/ 23 февраля 2011

Почему бы не использовать string.split, чтобы получить каждый операнд и значение отдельно. Затем вы можете разобрать его, используя гораздо более простое регулярное выражение ([\d*.\d*|\d|+|-|*|/]) или просто Integer.getInterger для ваших значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...