2010-05-10 5 views
1

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

Теперь, чтобы соответствовать дате, мы можем использовать DateTime.TryParseExact, и мы можем определить формат по мере необходимости, и дата будет сопоставлена ​​для любого другого формата.

string[] formats = {"MMM dd yyyy"}; 

      DateTime dateValue; 
      string dateString = "May 26 2008"; 

      if (DateTime.TryParseExact(dateString, formats, 
              new CultureInfo("en-US"), 
              DateTimeStyles.None, 
              out dateValue)) 

        MessageBox.Show(dateValue.ToString()); 

Это совпадает с date.But это не работает для разбора даты из строки, которая не согласуется с датой, которая находится в некоторой строке.

Как , если дата "May 26 2008", то мы можем определить формат "MMM dd yyyy", и дата будет соответствовать.

Но если дата в какой-то строке, например "Abc May 26 2008", то дата не будет соответствовать. Так что для этого мы можем использовать регулярное выражение здесь? Если да, то как?

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

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

+0

ли положение даты в пределах строки фиксированным (как это в конце или в определенном количестве символов)? – Bobby

+0

Нет, это не так, дата может быть где угодно в строке, на самом деле я разбираю строку со страницы html, а затем проверяю, есть ли дата в строке, если да, затем проанализируйте дату из строки. – Harikrishna

ответ

1

Если это только на английском языке и формат «MMM dd yyyy», вы можете искать, где находится ваша строка [Январь | Февраль | ... | Декабрь] день.

Но вы должны сначала спросить себя, почему вы разбираете любую строку. Не можете ли вы заставить пользователя использовать предопределенный формат и проверить этот ввод?

+0

Это не так. Я просматриваю html-страницу для отображения некоторой полезной информации в datagridview. Для этого я проверю каждую таблицу на странице html, и в каждой таблице я проверю каждую строку, и каждый раз проверяю каждый столбец columntext, который есть ли дата в columninnertext, а columninnertext может быть любой строкой. – Harikrishna

0

Если вы знаете, что ваша дата начнется с месяца, вы можете использовать подстроку, чтобы получить эту часть. (Найти появление Янв/Февраля/и т. Д.)

3

Вы могли бы выполнить регулярное выражение на чем-то вроде @"[A-Za-z]{3} \d{2} \d{4}" и подавать любые совпадения в DateTime.TryParseExact. Однако это может сломаться для альтернативных культур, но я не уверен, что есть языки, у которых есть месячные имена, всего 2 буквы короткие или что-то :)

В качестве альтернативы вы можете извлечь имена месяцев от cultureInfo.DateTimeFormat.AbbreviatedMonthNames и использовать их для создания немного лучше ориентированного регулярного выражения. Он также должен работать и для других культур.

Edit - вот пример:

string text = "Apr 03 2010 foo May 27 2008 bar"; 
CultureInfo ci = new CultureInfo("en-US"); 
Regex regex = new Regex(@"(?<date>(" + String.Join("|", 
    ci.DateTimeFormat.AbbreviatedMonthNames, 0, 12) + @") \d{2} \d{4})"); 

// Builds this regex: 
// (?<date>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4}) 

var matches = regex.Matches(text); 
foreach (Match match in matches) 
{ 
    string capturedText = match.Groups["date"].Value; 
    DateTime dt; 
    if (DateTime.TryParseExact(capturedText, "MMM dd yyyy", ci, 
     DateTimeStyles.None, out dt)) 
    { 
     Console.WriteLine(capturedText + ": " + dt.ToLongDateString()); 
    } 
} 

// Prints two parsed dates in long format 
+0

@ Торарин, я не понимаю. – Harikrishna

+0

@Harikrishna: вот рабочий пример. Немного изменил код, потому что, по-видимому, массив месяца содержит 13 элементов. Пример будет работать только с григорианским календарем. – Thorarin

+0

@ Thorarin, он не работает для 'Apr032010'. – Harikrishna

0

Я думаю, что-то вроде \w{3,8} \d\d \d\d\d\d[\s$] будет работать большую часть времени, если это в формате США, но я не стал бы доверять его слишком много, если текст вы разбираете может быть что угодно.

1

Вы можете настроить формат в соответствии с вашими потребностями:

private const string DateTimeFormat = "dd-MMM-yy hh.mm.ss.ffffff tt"; 

public static bool TryParseToDateTime(this string stringValue, out DateTime result) 
{ 
    if (String.IsNullOrEmpty(stringValue)) 
    { 
     result = DateTime.MinValue; 
     return false; 
    } 

    return DateTime.TryParseExact(stringValue, DateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 
} 

UPDATE: Вы, вероятно, следует использовать регулярные выражения для поиска строк, которые соответствуют дате в тексте. Вы должны решить, какой формат даты вы ожидаете, и написать (или выбрать) соответствующее регулярное выражение.Например, для формата «dd MMM yyyy» вы можете использовать следующие регулярные выражения:

^\ d {2} \ s {1} (Jan | Feb | Mar | Apr | May | Jun | Jul | Apr | сентябрь | октябрь | ноябрь | декабрь) \ s {1} \ d {4} $

Стивен Лам из http://regexlib.com/REDetails.aspx?regexp_id=325

в качестве альтернативы вы можете просматривать this site найти подходящее выражение.

+0

@ Boris, String не фиксируется, это может быть любой тип строки. – Harikrishna

+0

Харикришна, как бы вы хотели разобрать «1/3/10»? Это может быть 1 марта 2010 года или 3 января 2010 года или что-то еще? Вы должны определить желаемый формат и использовать регулярное выражение для поиска совпадений в тексте –

+0

@ Борис, Только один формат - 01/03/2010. Но если дата находится в любой строке, она должна быть сопоставлена. – Harikrishna

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