2013-12-09 2 views
1

Я пытаюсь проверить запрос, созданный пользователем.Проверка строки с использованием regex

То, что я хочу, чтобы

  • $xxxx$+87*(50*2)
  • 25*($total$-$absent$)
  • $total$+$present$

и т.д ...

Примечание: $THESE_ARE_NAME_OF_OPERANDS$

То, что я не хочу

  • $myoperand$+65io
  • ti88+$myoperand$
  • 7kio07 + $operand$

и т.д ...

До сих пор я пытался обнаружить плохие комбинации (т.е. сочетание цифр и алфавитов) использованием

var troublePattern = new Regex(@"\b[0-9]+[a-z|A-Z]"); 
string TroublePattern = troublePattern.ToString(); 
bool _present = Regex.IsMatch(UserFedData, TroublePattern, RegexOptions.None); 

Однако он не полностью работает. Полностью работая, я имею в виду, что он дает неожиданные результаты в какой-то момент.
Как мне изменить мое регулярное выражение, чтобы достичь моей цели?

+0

Покажите нам примеры, где даются неожиданные результаты. – Tobberoth

+0

Кажется, не существует явного метода того, что вы хотите, а не ... это просто порядок операндов, который решает, нормально ли это или нет? – Noctis

+0

@Noctis, Да, вы поняли это правильно. –

ответ

3

Ваше регулярное выражение должно быть

^(\(?\d+\)?|\(?[$][^$]+[$]\)?)([+*/-](\(?\d+\)?|\(?[$][^$]+[$]\)?))*$ 
----------------------------- -------------------------------------- 
     |      ------  |->matches 0 to many operands on right     | 
     |      | 
     |      |->matches operator +,-,*,/ 
     |->Matches an operand(digit or named variable) on left 
+0

Ницца. Однако, возможно, этот '[^ $] +' должен быть заменен на '[a-z | A-Z]', как указано автором? В противном случае пройдут переменные типа '$% # * $'. – gehho

+0

@gehho, не волнуйтесь, эти переменные не пройдут, поскольку vriables выбраны из combobox.Anirudh +1 –

0

я бы решить это с помощью комбинации логики и регулярных выражений.

Имейте метод, который будет проверять правильность порядка ваших операндов. Было бы легко заменить ваш $operand_name$ на X в методе проверки (например, заменить строку) и просто сравнить с этим (так что X+3 в порядке и 3+X - нет).

Затем вы можете использовать регулярное выражение для правильных значений вашего сердечного содержимого.

В противном случае, я вижу Anirudh имеет хороший регулярное выражение, вы можете охотиться на медведя с, но я бы не хотел быть один поддерживая этот код, не пытаясь добавить новые правила к нему :)

0

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

Похоже, что запрос представляет собой некоторый арифметический синтаксис (основные математические операции) с использованием переменных. Там должно быть какое-то COTS для вас.

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