Соответствие регулярных выражений числовому шаблону

#c# #regex

#c# #регулярное выражение

Вопрос:

Я работаю над анализом введенных пользователем данных для числа, которое принадлежит указанному шаблону, например 199-234

где

  1. первый компонент — это 1
  2. второй компонент — это 99
  3. третий компонент — это 234

Пользователь должен указать только первые несколько цифр или всю строку целиком. Я намерен разобрать каждый из компонентов. Reg-ex, который я придумал, является —

 Regex regex = new Regex(@"(?<first>d)(?<second>d{0,2})-?(?<third>d{0,3})");
var groups = regex.Match(input);
  

Если я предоставлю входные данные 199, шаблон reg-ex разбивает их на 3 группы вместо ожидаемых 2.
Фактический результат

  1. первый компонент — это 1
  2. второй компонент — это 9
  3. третий компонент — это 9

Как мне убедиться, что входные данные в этом случае будут правильно сопоставлены?

Ответ №1:

Попробуйте нежадную версию третьей группы: d{0,3}?

 Regex regex = new Regex(@"(?<first>d)(?<second>d{0,2})-?(?<third>d{0,3}?)");
var groups = regex.Match(input);
  

Это также может помочь (для наглядности) связать начало и конец строк ( ^ и $ )

 new Regex(@"^(?<first>d)(?<second>d{0,2})-?(?<third>d{0,3}?)$");
  

Ответ №2:

Поскольку вашему выражению требуется третий элемент, оно не может соответствовать 199 только двум группам, потому что для соответствия ему нужны три группы.

Также вы разрешаете совпадения нулевой длины для вашей второй и третьей групп.

Попробуйте указать ровно два символа для второй группы или сделать третью группу необязательной.

Ответ №3:

Сделайте всю последнюю часть необязательной, а не только -

 @"(?<first>d)(?<second>d{0,2})(?:-(?<third>d{0,3}))?"
  

Я поместил всю последнюю часть, начинающуюся с - , в необязательную группу (?:) без захвата данных. (?:-(?<third>d{0,3}))? Таким образом, он будет искать только третью группу, если есть - .

Комментарии:

1. Спасибо stema. Позвольте мне попробовать и это.