Регулярные выражения: шаблон для задания арифметической строки

Olya__

Добрый день. Мне нужно задать шаблон для проверки правильности пользовательского ввода арифметической строки вида a+b/c * d -k. То есть вводится строка, где операнды - целые числа, а операторы могут быть: +(сложение), -(вычитание), *(умножение), /(деление). У меня получилось только вот так:[0-9]+(-|\+|\*|\/){1}, но это несовершенный шаблон, он только делает выборку "операнд+операция". Заранее спасибо.
8 ответов

Olya__

Не совсем понятно задание, если проводится проверка на ввод, то что она должна "не пускать" ? буквы?
static void Main(string[] args)
        {
            var finalstr = new StringBuilder();
            string str = "sad4ffd5*dd7f+3ffd/4ff";
            var temp = Regex.Matches(str, @"[0-9]|(-|\+|\*|\/){1}");
            foreach (var i in temp)
                finalstr.Append(i);
            Console.WriteLine(finalstr);
            Console.ReadKey();
        }


Olya__

(?:\d+\s*[*+/-]\s*)+\d+ отловит выражение со знаками +*-/?, которое начинается с числа и заканчивается числом, с произвольным числом пробелов, символов табуляции и т.п. между ними. Оно?


Olya__

ITL, шаблон не должен пускать все символы, кроме цифр и +, -, /, * (арифметические операции). То есть "34+23-4/5*2+123" - правильная строка, а "/23*+jk/2/0" - неправильная. Другими словами, имитация работы калькулятора, где не должно быть деления на ноль ( то есть "/0") и других синтаксически неправильных выражений. Lasur, внутри строки не может быть символов табуляции, букв и др, не имеющих отношение к арифметическому выражению. Задание заключается в том, чтобы пользователь ввел строку как в стандартном калькуляторе, а программа должна перед вычислением выражения проверить корректность ввода.


Olya__

Держите: ^(?:\d+[*+/-])+\d+$ Пробелов тоже не может быть?


Olya__

Спасибо вам огромное, Lasur! Это то, что нужно. Единственное, можно ли исключить деление на ноль?


Olya__

Только явное "/0":
^(?:\d+([*+-]|/(?!0)))+\d+$
Можно чуть упростить, пожертвовав скоростью в случае неверного ввода:
^(\d+([*+-]|/(?!0)))+\d+$


Olya__

Спасибо за помощь, это очень красивое решение!


Olya__

Здравствуйте! Создал регулярное выражение для разделения на лексемы арифметического выражения вида "9/(5+3*2-8*2.55)":
exp = "9/(5+3*2-8*2.55)"
RxPattern = new Regex(@"(\+|\-|\*|\/|\(|\)|(\d+\.?\d*))");
MatchCollection mc = RxPattern.Matches(exp);
Перед этим хочу проверить выражение на условия, содержит только: 1) целые и дробные числа с разделителем . без повторов; 2) операторы + - * /; 3) скобки ();
RxPatternBanned = new Regex(@"ВЫРАЖЕНИЕ");
bool IsValid = RxPattern.Match(exp);
Просьба помочь составить регулярное ВЫРАЖЕНИЕ в моем случае