2013-04-25 25 views
5

Cho phép nói rằng tôi có một trong những chuỗi kí tự sau:Nhận ngày từ 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" 

Điều gì sẽ là cách tốt nhất và nhanh nhất để có được những ngày này từ chuỗi (trong DateTime)?

(Chỉ đầu tiên xảy ra ngày trong String)

Returns Desirable:

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

Vì vậy, tôi sẽ gọi một phương thức gì đó như:

DateTime date1 = GetFirstDateFromString(string1); 
+1

Điều này dường như là một vấn đề để giải quyết với Regular Expression! –

+1

Nếu đó là định dạng văn hóa cụ thể cho ngày, bạn có thể trích xuất định dạng ngày và sử dụng cụm từ thông dụng để tìm kiếm chuỗi. –

+0

Chúng có. Chúng luôn ở định dạng – eMi

Trả lời

13

này sẽ trích xuất, phân tích và in tất cả ngày trong văn bản đầu vào:

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

Bây giờ, nếu bạn chỉ muốn ngày đầu tiên, bạn có thể làm điều đó:

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

Lưu ý rằng phương thức trả về giá trị rỗng là DateTime, để nó có thể trả về null khi chuỗi không chứa ngày tháng.

+0

Điều này sẽ rơi trên, ví dụ "" 58.99.2013 "'. –

+0

@AntP, đúng; Tôi đã sửa nó –

+0

@MartinMulder, không có nó sẽ không; nó sẽ chỉ bỏ qua nó và xử lý các trận đấu tiếp theo –

0

Tạo một phương thức có các tham số thường xuyên biểu thức để nắm bắt định dạng ngày tháng và chuỗi mà bạn sẽ trích xuất ngày từ đó. Tôi tin rằng nếu bạn không có định dạng sẽ được sử dụng thì sẽ không thể trích xuất ngày từ một chuỗi ký tự chữ và số trong một chuỗi.

4

Nếu ngày của bạn luôn ở định dạng đó, bạn có thể thử sử dụng một regex để lấy chuỗi ngày và sau đó sử dụng DateTime.ParseExact để có được những kết quả mà bạn muốn:

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, nhưng bạn thực sự nên hiển thị mẫu regex. –

+0

@JimMischel Rất tiếc! Đã có một trên clipboard nhưng quên dán nó vào! Làm xong. –

+0

Sẽ thất bại, nếu 58.99.2013 nằm trong chuỗi trước ngày thực tế. –

1

Hãy thử điều này:

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

Điều này sẽ kết thúc, ví dụ: "58.99.2013" –

+0

Đã điều chỉnh! Nó bây giờ tìm kiếm ngày/thời gian khớp đầu tiên, nếu không trả về null. –

+0

cảm ơn vì nỗ lực +1 – eMi

Các vấn đề liên quan