Как разобрать дату из строки? - PullRequest
1 голос
/ 10 мая 2010

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

Теперь для сопоставления с датой мы можем использовать 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());

Это совпадает с датой. Но это не работает для анализа даты из строки, которая не совпадает с датой, которая есть в некоторой строке.

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

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

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

РЕДАКТИРОВАТЬ: Я хочу написать формат, который соответствует любой строке, в которой есть дата, используя регулярное выражение.

Ответы [ 6 ]

3 голосов
/ 10 мая 2010

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

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

Редактировать - вот пример:

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
1 голос
/ 10 мая 2010

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

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} (январь | февраль | март | апрель | май | июнь | июль | Апрель | Сентябрь | Октябрь | Ноябрь | Dec) \ S {1} \ d {4} $

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

В качестве альтернативы вы можете просмотреть этот сайт , чтобы найти соответствующее выражение.

1 голос
/ 10 мая 2010

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

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

0 голосов
/ 14 мая 2010

Вот ссылка для разбора даты из строки, что очень хорошо. Есть набор регулярных выражений для разбора даты из строки.

http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx

0 голосов
/ 10 мая 2010

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

0 голосов
/ 10 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...