2013-04-25 20 views
5

Diciamo che ho una delle seguenti stringhe:Get Data da String

"Hello, I'm a String... This is a Stackoverflowquestion!! Here is a Date: 16.03.2013, 02:35 and yeah, plain text blah blah..-." 

"This the other string! :) 22.11.2012. Its a Date you see" 

"Here we have 2 Dates, 23.12.2012 and 14.07.2011" 

Quale sarebbe il modo migliore e più veloce per ottenere queste date dalla stringa (in DateTime)?

(solo la prima si è verificato data data String)

Returns desiderabili:

String 1: 16.03.2013 (as a DateTime) 
String 2: 22.11.2012 ("   ") 
String 3: 23.12.2012 ("   ") 

così vorrei chiamare un metodo simile:

DateTime date1 = GetFirstDateFromString(string1); 
+1

Questo sembra essere un problema da risolvere con Espressione regolare! –

+1

Se si tratta di formati specifici della cultura per le date, è possibile estrarre il formato della data e utilizzare un'espressione regolare per cercare la stringa. –

+0

Sono sì. Sono sempre in tale formato – eMi

risposta

13

Questo estrarrà, analizzare e stampare tutti date nel testo di input:

var regex = new Regex(@"\b\d{2}\.\d{2}.\d{4}\b"); 
foreach(Match m in regex.Matches(inputText)) 
{ 
    DateTime dt; 
    if (DateTime.TryParseExact(m.Value, "dd.MM.yyyy", null, DateTimeStyles.None, out dt)) 
     Console.WriteLine(dt.ToString()); 
} 

Ora, se si desidera solo la prima data, si può fare:

static DateTime? GetFirstDateFromString(string inputText) 
{ 
    var regex = new Regex(@"\b\d{2}\.\d{2}.\d{4}\b"); 
    foreach(Match m in regex.Matches(inputText)) 
    { 
     DateTime dt; 
     if (DateTime.TryParseExact(m.Value, "dd.MM.yyyy", null, DateTimeStyles.None, out dt)) 
      return dt; 
    } 
    return null; 
} 

Si noti che il metodo restituisce un valore nullo DateTime, in modo che possa restituire null quando la stringa non contiene alcuna data.

+0

Si attiverà a questo, ad esempio "" 58.99.2013 "'. –

+0

@AntP, true; L'ho risolto –

+0

@ MartinMulder, no non lo farà; salterà e processerà la prossima partita –

0

Creare un metodo i cui parametri sono un regolare espressione per catturare il formato della data e la stringa da cui si estrae la data. Credo che se non si dispone di un formato che verrà utilizzato, non sarà possibile estrarre la data da una serie di caratteri alfanumerici in una stringa.

4

Se sono sempre le date in quel formato, si potrebbe provare a utilizzare una regex per afferrare la stringa della data e quindi utilizzare DateTime.ParseExact per ottenere il risultato desiderato:

public DateTime? GetFirstDateFromString(string input) 
{ 
    DateTime d; 

    // Exclude strings with no matching substring 
    foreach (Match m in Regex.Matches(input, @"[0-9]{2}\.[0-9]{2}\.[0-9]{4}")) 
    { 
     // Exclude matching substrings which aren't valid DateTimes 
     if (DateTime.TryParseExact(match.Value, "dd.MM.yyyy", null, 
      DateTimeStyles.None, out d)) 
     { 
      return d; 
     } 
    } 
    return null; 
} 
+0

+1, ma in realtà dovresti mostrare un'espressione regolare di esempio. –

+0

@JimMischel Oops! Ne avevo uno negli Appunti ma ho dimenticato di incollarlo! Fatto. –

+0

Errore, se 58.99.2013 è nella stringa prima di una data effettiva. –

1

Prova questa:

using System; 
using System.Text.RegularExpressions; 

public class Example 
{ 
    public static DateTime? GetFirstDateFromString(string input); 
    { 
     string pattern = @"\d{2}\.\d{2}\.\d{4}"; 
     Match m = Regex.Match(input, pattern); 
     DateTime result; 
     foreach(string value in match.Groups) 
      if (DateTime.TryParseExact(match.Groups[1], "dd.MM.yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out result) 
       return result; 
     return null; 
    } 
} 
+0

Questo cadrà sopra, ad esempio "58.99.2013" –

+0

Rettificato! Ora cerca la prima data/ora corrispondente, altrimenti restituisce null. –

+0

grazie per lo sforzo +1 – eMi