2015-05-27 4 views
0

Я пытаюсь проверить даты на C#.Группировка регулярных выражений в C#

мне нужно проверить для следующих форматов:

dd/mm/yy 
dd/mmm/yyyy 
dd-mm-yy 

Ниже выражение бросает исключение:

@"^(*\d{2}+[-\])+([\w{3}]|[\d{2}])+(\d{2,4})$" 

Просьба указать на ошибку в выражении.

+0

Просьба указать на ошибку в выражении – Sayse

+3

Ваша переменная а '' DateTime' или string'? Я бы использовал перегрузку 'DateTime.TryParseExact', которая принимает' string [] 'как форматы вместо регулярного выражения. –

+0

, вы также можете создать массив регулярных выражений для циклического завершения при проверке – Mivaweb

ответ

1

Отвечая на Ваш вопрос о регулярном выражении, есть несколько вопросов.

  • Критическим является проблема с (* в начале (уже указывал ВКС)
  • Другой важный вопрос с другой неуместной квантора + в d{2}+
  • И еще один вопрос, что вы разместили альтернативы в класс символов. ([\w{3}]|[\d{2}])+ означает "выбрать из 2-х вариантов: 1) \w, {, 3 или }, 2) \d, {, 2 или }, 1 или более вхождений".

Итак, ваше регулярное выражение в .NET привкуса регулярного выражения будет выглядеть следующим образом:

^(\p{N}{2})([/-])(\p{L}{3}|\p{N}{2})\2(\p{N}{2,4})$ 

См demo on RegexStorm that supports .NET regex

И более общая версия ^([0-9]{2})([/-])([a-zA-Z]{3}|[0-9]{2})\2([0-9]{2,4})$.

Однако, если вы хотите проверить DateTime значения, записанные в виде строк, вы должны DateTime.TryParseExact их. Вот пример, который отвечает вашим требованиям:

var fmts = new[] { "dd/MM/yy", "dd/MMM/yyyy", "dd-MM-yy"}; // Allowed formats 
DateTime dt; 
var valid1 = DateTime.TryParseExact("13/02/15", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt); 
// true 
var valid2 = DateTime.TryParseExact("10/Apr/2012", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt); 
// true 
var valid3 = DateTime.TryParseExact("23-02-10", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt); 
// true 
var valid4 = DateTime.TryParseExact("01-30-15", fmts, new System.Globalization.CultureInfo("en-us"), System.Globalization.DateTimeStyles.None, out dt); 
// false 
+0

. Рассмотрите также вопрос о возврате ответа, если вы сочтете это полезным (стрелка вверх слева). –

2
^(\d{2})([\/-])(\w{3}|\d{2})\2(\d{2,4})$ 

Угадайте, что вам это нужно.

`^(*` 

     ^^ 

Этот квантер дает ошибку, поскольку ей нечего количественно.

См. Демонстрационную версию.

https://regex101.com/r/tS1hW2/2