2009-08-31 6 views
0

J'ai un fichier de test qui a beaucoup de lignes, chaque ligne ressemble à quelque chose comme:extraction 2 fois par ligne dans un fichier texte

4:19 PM  5:15 PM this is some text blah blah 

je besoin d'un regex qui va tirer les 2 fois et les affecter à un variable. Donc, fondamentalement, je vais boucler dans un fichier texte, et extraire les informations de temps de chaque ligne et additionner la différence entre les deux.

J'ai besoin d'aide pour la regex.

Répondre

1

Il utilise une expression régulière légèrement modifié et ajoute les différences entre les dates que vous avez mentionné:

string[] input = { "4:19 PM   5:15 PM this is some text blah blah", 
        "3:00 PM   5:00 PM text" 
       }; 

// build up pattern 
string datePattern = @"(\d+:\d+\s(?:AM|PM))"; 
string pattern = String.Format("^{0}{1}{2}{3}$", 
           datePattern, @"\s+", datePattern, @"\s+.*"); 

TimeSpan total = new TimeSpan(); 
foreach (string text in input) 
{ 
    var match = Regex.Match(text, pattern); 
    if (match.Success) 
    { 
     // skip first group which has entire match 
     DateTime dt1 = DateTime.Parse(match.Groups[1].Value); 
     DateTime dt2 = DateTime.Parse(match.Groups[2].Value); 
     TimeSpan diff = dt2 - dt1; 
     total += diff; 
    } 
} 
Console.WriteLine("Total difference: {0}", total); 

Résultat: Différence: 02:56:00


Si vous êtes confiant que vos données sont dans le format correct, vous pouvez faire l'expression régulière très simple comme suit:

string text = "4:19 PM   5:15 PM this is some text blah blah"; 
    string pattern = @"(?<time>\d+:\d+)\s(?<period>AM|PM)"; 

foreach(Match m in Regex.Matches(text, pattern)) 
{ 
    Console.WriteLine("Time: {0} - Period: {1}", 
     m.Groups["time"].Value, 
     m.Groups["period"].Value 
     ); 
} 

Si vous ne faites pas confiance aux données, vous aurez probablement besoin de quelque chose de plus robuste.

+0

Pourquoi les downvotes? –

+0

@homestead: assurez-vous d'avoir la dernière édition. Il me manquait un élément dans la partie d'accumulation de motif et je vous ai vu marqué comme la réponse avant que j'aie fini d'éditer. –

2

Essayez ceci:

^([0-9][0-9]*:[0-9][0-9]* (AM|PM))(\t|)+([0-9][0-9]*:[0-9][0-9]* (AM|PM)) 

Les données sont au 1er et 4ème partie.

Questions connexes