2015-04-24 5 views
2

Я пытаюсь написать регулярное выражение, чтобы проверить, соответствует ли данная строка a + b, 2 + a + b, 3 + 6 * 9 + 6 * 5 + a * b и т. Д. ...Регулярное выражение для арифметического выражения

Только + и * операторы.

Я попытался

if (str.matches("(\\d|\\w \\+|\\*){1,} \\d|\\w"))

К сожалению, он обрабатывает только случаи, как 3 * 7 ... (цифровая * цифровая).

Жду ваших ответов, спасибо, что прочитали меня.

+0

классовый характер (ала @AvinashRaj) явно лучше. Чисто в образовательных целях проблема с вашим использованием вертикальной панели заключается в том, что вы не группировали вещи до и после. Если вы хотите '\\ + | \\ *', вам нужно сгруппировать их как '(?: \\ + | \\ *)'. То же самое с '\\ d \\\ w', хотя это не так важно, так как \\ w включает \\ d. –

ответ

2

Положить * и + внутри класса персонажа.

str.matches("\\w(?:\\s[+*]\\s\\w)+"); 

DEMO

+0

Действительно, похоже, что это работает. Tank you – MedAl

+0

@MedAl, так как вы новичок в StackOverflow, я предлагаю вам прочитать [this] (http://stackoverflow.com/help/accepted-answer) –

1

Это будет обрабатывать случаи простой и прикованных расчеты

[0-9A-Za-a]*(){0,}([+-/*](){0,}[0-9A-Za-a]*(){0,})* 

Этот матч будет, например

  • 1 + 2
  • 1 + 2
  • 1 + а * 14/9

(Вы можете изменить операторы, которые вы хотите, обновляя [+-/*])

+0

Почему все '{0,}' вместо просто ' * '? –

+0

Поскольку у вас есть '*' вместо '+' после '[0-9a-z]' ваш re также будет соответствовать '+' или '+ - * /' или etc –

+0

Это '() {0,}' поэтому он допускает дополнительные пробелы - и только пробелы - между операндами –

Смежные вопросы