2013-03-24 1 views
1

Мне нужно специальное регулярное выражение для шаблона короткой даты математики (и т. Д. «M/dd/yyyy», «dd/mm/yyyy», «yyyy/mm/dd», ... зависит от культуры ..), то я могу получить день, месяц, год, чтобы разобрать этот формат следующим образом:Регулярное выражение для сопоставления короткого шаблона даты в любой культуре

string input = "03/24/2013"; 
    Match m = Regex.Match(input, @"^(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4})$"); 
    if(m.Success) 
    { 
     DateTime d = new DateTime(int.Parse(m.Groups["year"].Value), 
            int.Parse(m.Groups["month"].Value), 
            int.Parse(m.Groups["day"].Value)); 

    } 

но! это выражение не поддерживает все различные форматы так

требуют:

  • Принимать только '/' в качестве разделителей.
  • Действителен весь короткий шаблон даты (только дата, также время будет большим) в различных культурах (и т. Д., En-US, th-TH, jp-JP, ...). Возможно ли это, на самом деле мне просто нужно знать, какая часть - год, месяц или день, но я не мог найти ее нигде. Пожалуйста, помогите мне ...
  • Действительно общий диапазон: день [1-31] ​​{1-2}, месяц [1-12] {1-2}, год [1600-9999] {4}
+2

Зачем вам нужно регулярное выражение для этого, а не делать это, итерируя через культуры? Имейте в виду, что год «1600» - это не одно и то же в разных культурах, например, вас интересует только * григорианский год? –

+2

Используйте 'DateTime.TryParse', перемещаясь по различным культурам. http://msdn.microsoft.com/en-us/library/9h21f14e.aspx Обратите внимание, однако, что проблема двусмысленности. Строка «03/12/2013» может быть 12 марта или 3 декабря, в зависимости от культуры. –

+0

@JonSkeet, я понятия не имею об этом году, найденном на regexlib.com, просто игнорирую его. во всяком случае, итерируя через культуры umm .. этот интересный вы можете дать мне больше намека (код), спасибо –

ответ

1

Как Джим и я предложил, вы можете просто перебрать все культуры:

foreach (var culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
{ 
    DateTime result; 
    if (DateTime.TryParseExact(text, "d", culture, DateTimeStyles.None, 
           out result)) 
    { 
     // Valid - return, or whatever 
    } 
} 

Обратите внимание, что "d" стандартный формат строка на короткий шаблон даты. Кроме того, вы можете использовать culture.DateTimeFormat.ShortDatePattern.

+0

Еще раз спасибо, за то, что пришли на свет. –

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