2013-12-06 1 views
1

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

В конце его выражение выходит быть

4+59+8 //this is just an example. 

однако он также может ввести что-то вроде

4+59ab+8 

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

+0

Is '4 + аб + 8' разрешено? – Stijn

+0

Вы хотите разрешить «алфавиты» или просто «цифры»? – Shaharyar

+0

Итак, вы хотите регулярное выражение, которое позволяет только числа и математические символы? Звучит тривиально, какая у вас проблема? – Barmar

ответ

3

Это регулярное выражение кажется, что вы хотите:

^[\d-+/*^]+$ 

Это позволит любую комбинацию цифр и математических операторов -, +, /, *, ^.

Это не идеальный вариант, поскольку он позволяет вводить только операторы или имеет несколько операторов в строке и т. Д. Хотя может быть возможно написать регулярное выражение, которое будет соответствовать только действительным выражениям, вероятно, было бы лучше для этого в синтаксическом анализаторе, который будет фактически оценивать выражение. Используйте регулярное выражение только для простой предварительной проверки.

+0

'9 + */5 +' также считается действительным с этим –

+0

@SriramSakthivel Я знаю, я обновлял свой ответ относительно этого, когда вы написали комментарий. – Barmar

+0

Вы можете группировать цифры отдельно от операторов, чтобы они работали.Конечно, после группировки цифр и операторов вам больше не нужно анализировать остальное регулярное выражение –

0

Вы можете просто ходить и проверять вручную, например.

var chars = expr.ToCharArray(); 
var opers = new char[] { '+', '-', '/', '*' }; 
bool isOp = false; 

for (var i = 0; i < chars.Length; i++) 
{ 
    char c = chars[i]; 

    if (opers.Contains(c)) 
    { 
     if (isOp || i == 0) 
      throw new ArgumentException("operator leads or follows operator @ " + (i + 1)); 

     isOp = true; 
    } 
    else if (!char.IsNumber(c)) 
     throw new ArgumentException("found NaN @ " + (i + 1)); 
    else 
     isOp = false; 
} 

if (isOp) 
    throw new ArgumentException("ends with operator"); 
1

В следующем регулярное выражение (refiddle here):

^([-+]?\d+[-+/*^])*[-+]?\d+$ 

будет соответствовать линии, которая заканчивается последовательностью цифр, которому предшествует ноль или более последовательностей цифр с оператором.

Это будет соответствовать:

95 
9+5 

, но не будет соответствовать:

95+ 
+95 
95++5 

С немного более тонкой настройки, вы можете даже Extreact числа и операторы, так что вам не придется разобрать выражение снова.

EDIT

Добавлен дополнительный префикс +/-

+0

Это не позволит использовать '10 * -5' или' -22 + 3', т. Е. Отрицательные числа не могут быть использованы. – Barmar

+0

Теперь. Просто нужно добавить [- +]? Перед цифрами –

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