Если вас не интересует проверка даты (например, будет принято 31 февраля, вы можете сделать
new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");
Если вы хотите понять, что означает эта строка, взгляните на ссылка на MSDN .
Теперь для проверки даты, поэтому, отфильтровывая даты, такие как 310298
, которые не существуют, я бы порекомендовал сделать это вручную позже - регулярное выражение не лучший инструментдля такой логической проверки.
РЕДАКТИРОВАТЬ:
Это можно сделать с помощью DateTime.TryParse
.
DateTime resultDateTime;
var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 31), out resultDateTime);
// isValid is false, because 31st of February 2010 does not exist.
var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 27), out resultDateTime);
// isValid is true, and resultDateTime has been set to 27-2-2010.
Обратите внимание, что DateTime.TryParse
является чувствительным к культуре. В зависимости отцелевая культура, вам может потребоваться изменить строку ввода. См. Ссылка MSDN для TryParse
.
EDIT2:
Итак, чтобы связать это с существующим кодом:
mRegxExpression = new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");
var match = mRegxExpression.Match(per_kods.Text.Trim()));
if(!Validate(match))
{
// Handle invalid.
}
else
{
// Handle valid.
}
Где Validate
будет:
private static bool Validate(Match match)
{
if(!match.Success)
{
return false;
}
var day = match.Groups[1].ToString();
var month = match.Groups[2].ToString();
var year = match.Groups[3].ToString();
return DateTime.TryParse($"{day}-{month}-{year}", out _);
}
Поскольку наше регулярное выражение начинается с ^
и заканчивается $
, всегда будет не более одного совпадения. Success
свойство сообщает нам, было ли какое-либо совпадение, а позже свойство Groups
дает намзахватывать группы.Groups[0]
будет всей совпавшей строкой, а затем каждая следующая будет подстрокой, которая соответствует одной из скобок, заключенных в группы из регулярных выражений - поэтому первая - (0[1-9]|[1-2]\d|3[0-1])
, которая представляет дни, вторая - месяцы и т. Д.на.Затем мы просто проверяем, является ли дата действительной (опять же, с учетом культуры!).Кроме того, мы можем аккуратно использовать синтаксис отбрасывания C # 7 (_
) для параметра out
, так как он нам не нужен.