2013-11-13 3 views
2

пользователь может ввести следующее: I $ 1 $ 5 $ 10 $ 20 $ 50 $ 100Match регулярное выражение шаблон для массива долларовых купюр

Заказ не важно, и я не беспокоюсь, если они входят в деноминации более один раз (т.е. I $ 1 $ 5 $ 5). Начало ввода начинается с капитала «I», за которым следует пробел.

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

^I \ S (\ $ 1 | \ $ [5] | \ $ 10 | \ $ 20 | \ $ 50 | \ $ [100]) $

Я хочу подтвердить, что вход действителен.

+0

Что вы хотите получить? массив чисел или подтвердить этот ввод? –

+2

regex не является хорошим инструментом для решения этой проблемы. –

+0

@IlyaIvanov Я хочу посмотреть, действителен ли вход (обновленный вопрос) – contactmatt

ответ

2
regex = "^I(?:\s\$(?:10?0?|20|50?))+$" 

^I говорит начинается с 'I'
(?:\s\$ говорят группу, но не улавливает пробельный с последующим '$' с последующим следующим выражением
(?:10?0?|20|50?) говорит группа, но не захватить 1 и затем до двух 0-х или или 5 следуют до 0 один
+ говорит хотя бы один матч
$ говорит, что заканчивается предшествующим

+0

+1 для объяснения. Мне нравится, когда люди объясняют свое регулярное выражение. – contactmatt

+0

@contactmatt Без проблем, рад, что я мог бы помочь. Удачи! –

0

Идея заключается в том, чтобы ожидать после I либо пробел, либо $1, $5 и т.д ...

string[] options = 
      { 
       "I $1 $5 $10 $20 $50 $100", 
       "I $1 $5 $5", 
       "I wrong", 
       "$1 $5 $5", 
       "I", 
       "I ", 
      }; 
var reg = new Regex(@"^I\s(\s|(\$1|\$5|\$10|\$20|\$50|\$100))*$"); 

foreach (var option in options) 
{ 
    var status = reg.Match(option).Success ? "valid" : "invalid"; 
    Console.WriteLine("{0} -> is {1} (length: {2})", option.PadRight(25), status, option.Length); 
} 

печатает:

I $1 $5 $10 $20 $50 $100 -> is valid (length: 24) 
I $1 $5 $5    -> is valid (length: 10) 
I wrong     -> is invalid (length: 7) 
$1 $5 $5     -> is invalid (length: 8) 
I       -> is invalid (length: 1) 
I       -> is valid (length: 2) 
+0

Это неверно: '' I "' соответствует. Он также излишне длинный и захватывает, а не просто группирует. –

+0

@SteveP. спасибо за хороший улов. 'также излишне долгий' согласны, но уверены ли вы, что ваши варианты достаточно короткие? Кроме того, вы пробовали свой шаблон для '' I'''? Должно ли это пройти? –

+0

Он не должен проходить, полагаю. Я считаю, что моя правильно классифицирует то, что нужно, и короче. –

-1

Вы можете использовать регулярные выражения с проверкой на цифры

I[\s\$\d]*$ 

Howeever Я бы предложил использовать строку String .split (»», вход) и идти оттуда

+0

Это не работает по множеству причин. Он работает для допустимых примеров, но также принимает множество недопустимых примеров. –

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