2010-12-06 2 views
2

У меня есть строка с двумя включенными датами. Я посмотрел на функцию .Split и .Substring. Не уверен, что я отправился на самый эффективный маршрут. Есть ли чистый способ вытащить даты из строки?Как вывести 2 даты из строковой переменной?

string test = "Hello World. Random date1 is 12/10/2010. Now 4 days later is 12/14/2010." 
+3

Являются даты всегда в том же формате, или они могут различаться? – cdhowie 2010-12-06 21:13:46

+0

Является ли текст (кроме дат) случайным или всегда одинаковым? – ncakmak 2010-12-06 21:14:43

+0

Текст тот же. Формат тот же ... date.ToShortDateString() – MrM 2010-12-06 21:18:11

ответ

5

Если формат даты не изменится, вы могли бы сделать что-то вроде этого:

private static readonly Regex dateRegex = new Regex(@"\d{1,2}/\d{1,2}/\d{4}"); 

public static IEnumerable<string> ExtractDates(string str) 
{ 
    return dateRegex.Matches(str).Cast<Match>().Select(match => match.Value); 
} 

Затем используйте это нравится:

foreach (var dateString in ExtractDates("...")) { 
    // ... 
} 

Протестировано и работает против вашего примера строки.

0

Если это на самом деле альтернативы вы заинтересованы в, и формат строки does't изменения, вы можете:

 
string[] dates = test.Replace("Hello World. Random date1 is ", "").Replace("Now 4 days later is ", " ").Split(" "); 

или просто разделить на текст, который не меняется.

0

Регулярное выражение было бы самым общим способом, но, в зависимости от содержания по датам, может быть трудно получить право. Это потенциально будет очень чистым, но может быть довольно уродливым. С положительной стороны вы можете гарантировать, что это всегда будет всего лишь несколько строк кода, и это легко изменить.

Если ваши даты всегда указаны под конкретными индексами, вы можете использовать substring, но если (например) вы могли бы иметь Now 10 days later..., тогда это не будет работать очень хорошо.

Split будет работать, если вы знаете, что каждая дата всегда является n-м словом в строке.

РЕДАКТИРОВАТЬ: Просто видел, что ваши комментарии о тексте и формате всегда совпадают. Я бы использовал split или регулярное выражение, например Hello world. Random date1 is (\d\d/\d\d/\d\d\d\d). Now \d+ days later is (\d\d/\d\d/\d\d\d\d). (Я знаю, вы могли бы сделать это более кратким, но это сработает. Думаю.)

EDIT2: более кратким регулярным выражением после немного больше мысли: .*?(\d{2}/\d{2}/\d{4}).*?(\d{2}/\d{2}/\d{4}). Это позволит вам изменить окружающий текст, не обновляя регулярное выражение.

0

Это сложный вопрос. Вы могли бы сделать что-то вроде этого:

List<DateTime> dates = new List<DateTime>(); 

string test = "Hello World. Random date1 is 12/10/2010. Now 4 days later is 12/14/2010." 
var potentialDates = test.Split(" .",StringSplitOptions.RemoveEmptyEntries); 
foreach (string s in potentialDates) 
{ 
    DateTime d; 
    if (DateTime.TryParseExact(s, "MM/dd/yyyy", out d)) 
    { 
    dates.Add(d); 
    } 
} 

Это, вероятно, может быть LINQ-маньяков, но он должен работать нормально, как есть. Пока указаны даты, это должно найти работу. Если у вас есть время, или если в вашем формате даты есть '.', вы можете захотеть изменить Split только для разделения на пробел. Возможно, вы могли бы обрезать ведущую и завершающую пунктуацию и быть в порядке. Может быть, что-то вроде этого:

List<DateTime> dates = new List<DateTime>(); 

string test = "Hello World. Random date1 is 12/10/2010. Now 4 days later is 12/14/2010." 
var potentialDates = test.Split(" ",StringSplitOptions.RemoveEmptyEntries); 
foreach (string s in potentialDates) 
{ 
    DateTime d; 
    if (DateTime.TryParseExact(s.Trim(',', '.', ';', ':'), "MM/dd/yyyy", out d)) 
    { 
    dates.Add(d); 
    } 
} 
0

Использование регулярных выражений

public void SampleRegexUsage() 
{ 
    string regex = @"\d{2}/\d{2}/\d{4}"; 
    RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline; 
    string input = @"Hello World. Random date1 is 12/10/2010. Now 4 days later is 12/14/2010."; 

    MatchCollection matches = Regex.Matches(input, regex, options); 
    foreach (Match match in matches) 
    { 
     Console.WriteLine(match.Value); 

     Console.WriteLine(":" + match.Groups[""].Value); 

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