2013-04-25 3 views
5

Допустим, у меня есть одна из следующих строк:Получить Дата из строки

"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" 

Что бы лучший и самый быстрый способ получить эти даты из строки (в DateTime)?

(только Первая произошла Дата в String)

Желательные Возвращает:

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

Так что я бы назвал метод что-то вроде:

DateTime date1 = GetFirstDateFromString(string1); 
+1

Это, кажется, проблему решить с использованием регулярных выражений! –

+1

Если это форматы, относящиеся к культуре для дат, вы можете извлечь формат даты и использовать регулярное выражение для поиска строки. –

+0

Они да. Они всегда находятся в таком формате – eMi

ответ

13

Это будет извлекать, анализировать и распечатать все даты во входном тексте:

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

Теперь, если вы просто хотите, первое свидание, вы можете сделать это:

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

Обратите внимание, что метод возвращает nullable DateTime, так что он может вернуть значение null, когда строка не содержит даты.

+0

Это упадет, например, '' 58.99.2013''. –

+0

@AntP, true; Я исправил его –

+0

@MartinMulder, нет. он просто пропустит его и обработает следующий матч –

0

Создайте метод, параметры которого являются регулярными выражение, чтобы уловить формат даты и строку, из которой вы будете извлекать дату. Я считаю, что если у вас нет формата, который будет использоваться, тогда невозможно будет извлечь дату из серии буквенно-цифровых символов в строке.

4

Если ваши даты всегда в этом формате, вы можете попробовать использовать регулярные выражения, чтобы захватить строку даты, а затем использовать DateTime.ParseExact, чтобы получить результат, который вы хотите:

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, но вам действительно нужно показать примерное регулярное выражение. –

+0

@JimMischel К сожалению! Если бы один в буфере обмена, но забыл вставить его! Готово. –

+0

Ошибка, если 58.99.2013 находится в строке до фактической даты. –

1

Попробуйте это:

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

Это упадет, например, «58.99.2013» –

+0

Скорректировано! Теперь он ищет первую совпадающую дату/время, иначе возвращает null. –

+0

спасибо за усилие +1 – eMi

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