2017-01-13 5 views
0

У меня есть следующий вопрос:Regex выражение для согласования диапазонов

  • Строка должна быть подтверждена с помощью регулярных выражений-выражения.
  • Строка содержит диапазоны или одиночные значения, разделенные точкой с запятой, например. 100-200;10;2300-3400;34;
  • Максимальное значение каждого номера: 99999.
  • В строке нет букв.

То, что я до сих пор:

^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$? 

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

  • Начало: ^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])?
  • Средний: ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])?
  • End : ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?

Это регулярное выражение не решает мою проблему, хотя, например, буквы внутри входного выражения часто возвращают true, но должны возвращать false. Любая идея о том, как это решить?

Это упрощенная версия регулярных выражений следующий комментарий по РБ:

  • Начало: ^(\d{1,5}\-\d{1,5};)? ^(\d{1,5};)?
  • Средний: (\d{1,5}\-\d{1,5};)? (\d{1,5};)?
  • Конец: (\d{1,5}\-\d{1,5};)*$? (\d{1,5};)*$?
+0

как насчет отрицательных диапазонов '-10-10' и нисходящих диапазонов' 200-100'? – fubo

+0

Отрицательные диапазоны не допускаются, нисходящие - – Chris

+2

Почему бы просто не использовать строку, разделенную первым разделом точкой с запятой, а затем тире. Наконец, используйте int.TryParse. – jdweng

ответ

1

Как об этом, чтобы извлечь группы:

\b(?<FirstNum>[1-9][0-9]{1,4})(-(?<SecondNum>[1-9][0-9]{1,4}))?; 

Permalink to RegexStorm включая два недействительных чехла 1234- и 12345678912345.

Затем, чтобы проверить, содержит ли она письма просто использовать ниже выражение:

[A-Za-z] 

и проверить его:

Regex regex = new Regex("[A-Za-z]"); 
if (regex.IsMatch(inputString)) 
{ 
    //Invalid string 
} 

Хотя регулярное выражение полезно, если вы на самом деле необходимо использовать диапазоны позже, лучше использовать комбинацию string.Split и int.TryParse:

string input = "100-200;10;2300-3400;34;"; 

string[] ranges = input.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string range in ranges) 
{ 
    string[] numbers = range.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string number in numbers) 
    { 
     int parsedNumber; 
     if (!Int32.TryParse(number, out parsedNumber)) 
     { 
      //Invalid input 
      break; //Or return false... 
     } 

     //Use parsedNumber here 
    } 
} 
+0

Регулярное выражение позволит вводить такие данные, как '1234-' и '1234512345'. Также он позволяет вести (или все) нули, хотя оригинал тоже сделал, поэтому просто указывая, что вне – pinkfloydx33

+0

@ pinkfloydx33 Хорошие уловы, которые я обновил, поэтому он должен работать сейчас – TheLethalCoder

+1

@ pinkfloydx33 Я добавил постоянную ссылку сейчас для тестирования и тоже исправлена ​​другая проблема, поэтому он проверяет границу слова в начале матча – TheLethalCoder

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