2013-04-25 15 views
5

Powiedzmy mam jedną z następujących ciągów:Get Data od 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" 

Jaki byłby najlepszy i najszybszy sposób, aby uzyskać te daty z łańcucha (w DateTime)?

(Tylko pierwsze wystąpiły Data w łańcuchach)

pożądane Powroty:

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

Więc chciałbym wywołać metodę na coś takiego:

DateTime date1 = GetFirstDateFromString(string1); 
+1

To wydaje się być problemem do rozwiązania z Regular Expression! –

+1

Jeśli są to formaty specyficzne dla kultury dla dat, można wyodrębnić format daty i użyć wyrażenia regularnego do wyszukania ciągu znaków. –

+0

Są tak. Są zawsze w takim formacie – eMi

Odpowiedz

13

To będzie wyodrębnić, analizować i wydrukować wszystkie daty w tekście wejściowym:

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()); 
} 

teraz, jeśli chcesz tylko pierwszy dzień, można to zrobić:

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; 
} 

Należy zwrócić uwagę, że metoda zwraca wartość zerową DateTime, dzięki czemu może zwrócić wartość null, gdy ciąg nie zawiera daty.

+0

Zostanie to przeniesione na przykład na "58.99.2013". –

+0

@AntP, true; Naprawiłem to –

+0

@MartinMulder, nie, nie będzie; to po prostu pominie i przetworzy następny mecz –

0

utworzyć metodę, którego parametry są regularne wyrażenie, aby wychwycić format daty i ciąg, z którego będziesz wyodrębniać datę. Uważam, że jeśli nie masz formatu, który zostanie użyty, nie będzie możliwe wyodrębnienie daty z serii znaków alfanumerycznych w ciągu znaków.

4

Jeśli daty są zawsze w tym formacie, można spróbować użyć wyrażenia regularnego, aby pobrać ciąg daty, a następnie użyć DateTime.ParseExact, aby uzyskać wynik, który chcesz:

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, ale naprawdę powinieneś pokazać przykładowe wyrażenie regularne. –

+0

@JimMischel Ups! Miałem w schowku, ale zapomniałem go wkleić! Gotowe. –

+0

Zawodzi, jeśli 58.99.2013 jest w ciągu znaków przed faktyczną datą. –

1

Spróbuj tego:

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

To się przewróci, na przykład "58.99.2013" –

+0

Skorygowany! Teraz wyszukuje pierwszą pasującą datę/czas, w przeciwnym razie zwraca wartość null. –

+0

dzięki za wysiłek +1 – eMi