2010-12-07 39 views
1

j'ai les chaînes suivantes:Comment formuler une regex pour obtenir des dates à partir de chaînes spécifiques?

Mois:
Jan11
Feb11
Mar11
Apr11
etc.
Quartiers:
Q1 Q2 11
Q3 11
Q4 11
Q1 12
etc.
ans
Cal_11
Cal_12
Cal_13
etc.

Je voudrais utiliser une expression régulière pour créer un objet DateTime à partir du début de chaque date représentée par une chaîne. Alors Jan11 serait

new DateTime(2011,1,1) 

, Q2 11 serait

new DateTime(2011,4,1) 

et Cal_12 serait

new DateTime(2012,1,1). 
+0

Pas d'intérêt - pourquoi une regex? Pourriez-vous maintenir quelques petits dictionnaires de nom -> mappings de valeur pour le faire? –

Répondre

2

Cela devrait prendre de trois cas:

DateTime? parse(string text) 
{ 
    Match m = Regex.Match(text, @"^(\w\w\w)(\d+)$"); 
    if (m.Success) 
    { 
     return new DateTime(
      2000 + Convert.ToInt32(m.Groups[2].Value), 
      1 + Array.IndexOf(CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames, m.Groups[1].Value), 
      1); 
    } 

    m = Regex.Match(text, @"^Q(\d+) (\d+)$"); 
    if (m.Success) 
    { 
     return new DateTime(
      2000 + Convert.ToInt32(m.Groups[2].Value), 
      1 + 3 * (Convert.ToInt32(m.Groups[1].Value) - 1), 
      1); 
    } 

    m = Regex.Match(text, @"^Cal_(\d+)$"); 
    if (m.Success) 
    { 
     return new DateTime(
      2000 + Convert.ToInt32(m.Groups[1].Value), 
      1, 
      1); 
    } 

    return null; 
} 

appel comme ceci:Veuillez noter que cela ne tient pas compte des données incorrectes transmises. Cela pourrait évidemment être ajouté, mais cela rendrait l'exemple assez encombré.