Я хочу что-то вроде этого:
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, который позволяет очень легко настроить, какие форматы разрешены, а также обрабатывать двухзначные годы. Производительность вполне приемлема, учитывая, что это обрабатывается асинхронно. Сложность заключалась в том, чтобы токенизировать и эффективно тестировать наборы смежных токенов.