Распознать даты в строке - PullRequest
2 голосов
/ 07 марта 2011

Я хочу что-то вроде этого:

public interface IDateRecognizer
{
    DateTime[] Recognize(string s);
}

Даты могут существовать в любом месте строки и могут иметь любой формат. На данный момент я могу ограничиться форматами культуры США. Даты не будут ограничены каким-либо образом. Они могут иметь произвольное количество пробелов между частями даты. У меня есть следующие идеи:

  • ANTLR
  • Regex
  • Ручной прокат

Я никогда не использовал ANTLR, поэтому я бы учился с нуля. Интересно, есть ли библиотеки или примеры кода, которые делают что-то похожее, что может привести меня в замешательство? ANTLR слишком тяжел для такого узкого использования?

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

Я, конечно, мог бы бросить его вручную, но я бы не стал заново решать решенную проблему.

Предложения?

ОБНОВЛЕНИЕ : Вот пример. Учитывая этот вход:

Это дата 11/3/63. Вот еще один: 3 ноября 1963 года; а также еще один ноябрь 03, 63 и некоторые больше (03.11.1963). Даты могут быть в любом формате США. Они могут иметь тире как 11-2-1963 или странные дополнительные пробелы внутри вот так: 3 ноября 1963 г. и даже, возможно, запятая отсутствует как [3 ноября 63], но это преимущество случай.

Выходные данные должны быть массивом из семи DateTimes. Каждая дата будет одинаковой: 03.11.1963 00: 00: 00.

ОБНОВЛЕНИЕ : Я полностью сдал это, и я доволен результатом. Вместо использования Regex я в итоге использовал DateTime.TryParse с пользовательским DateTimeFormatInfo, который позволяет очень легко настроить, какие форматы разрешены, а также обрабатывать двухзначные годы. Производительность вполне приемлема, учитывая, что это обрабатывается асинхронно. Сложность заключалась в том, чтобы токенизировать и эффективно тестировать наборы смежных токенов.

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

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

1 голос
/ 07 марта 2011

Я бы посоветовал вам пойти с регулярным выражением. Я бы поместил одно регулярное выражение (соответствующее одной дате) в одну строку и несколько из них в массив. Затем создайте полное регулярное выражение во время выполнения. Это делает систему более гибкой. В зависимости от того, что вам нужно, вы можете рассмотреть возможность добавления другого регулярного выражения в (XML) файл / db.

0 голосов
/ 07 марта 2011

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

ANTLR для этого случая, когда у вас очень ограниченный набор семантики, просто избыточно.

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

Так что я бы пошел с Regex.

...