Распознать произвольную строку даты - PullRequest
22 голосов
/ 03 октября 2010

Мне нужно иметь возможность распознавать строки даты.Не имеет значения, если я не могу различить месяц и дату (например, 12/12/10), мне просто нужно классифицировать строку как дату, а не преобразовывать ее в объект Date.Таким образом, это действительно проблема классификации, а не анализа.

У меня будут такие фрагменты текста, как:

"бла бла бла бла * 12 января 09 бла бла бла бла 01/04/10 бла бла бла "

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

Мне было интересно, знает ли кто-нибудь какие-либо библиотеки Javaэто может сделать это.Мой гугл-фу пока ничего не придумал.

ОБНОВЛЕНИЕ: я должен быть в состоянии распознать самый широкий из возможных способов представления даты.Конечно, наивным решением может быть написание оператора if для каждого мыслимого формата, но в идеале подход распознавания образов *1018* с обученной моделью - в идеале то, что мне нужно.

Ответы [ 14 ]

0 голосов
/ 03 октября 2010

Вы всегда можете проверить, есть ли в строке два символа '/'.

public static boolean isDate(){
     String date = "12/25/2010";
     int counter = 0;
     for(int i=0; i<date.length(); i++){
          if ("\/-.".indexOf(date.charAt(i)) != -1) //Any symbol can be used. 
               counter++;
     }
     if(counter == 2)    //If there are two symbols in the string,
          return true;   //Return true.
     else
          return false;
}

Вы можете сделать что-то подобное, чтобы проверить, является ли все остальное целым числом.

0 голосов
/ 03 октября 2010

Я не знаю ни одной библиотеки, которая бы делала это тоже.Я бы предложил сочетание вложенных рекурсивных функций и регулярных выражений (много) для сопоставления строк и попытался найти наилучшее предположение, чтобы увидеть, может ли это быть дата.Даты могут быть записаны разными способами, некоторые люди могут записать их как «Воскресенье, 3 октября 2010 года» или «Воскресенье, 3 октября 2010 года» или «10/03/2010» или «3/3/2010» ицелый ряд разных способов (даже больше, если вы рассматриваете даты на других языках / культурах).

0 голосов
/ 03 октября 2010

Я не знаю ни одной библиотеки, которая могла бы сделать это, но написать свою собственную не было бы невероятно сложно.Предполагая, что все ваши даты отформатированы с косыми чертами, такими как 12/12/12, вы можете убедиться, что у вас есть три.Вы могли бы стать еще более техническими и сделать так, чтобы он проверял значения между слешами.Например, если у вас есть:

30/12/10

Тогда вы знаете, что 30 - это дни, а 12 - месяц.Однако, если вы получите 30/30/10, вы знаете, что, хотя ti имеет правильный формат, это не может быть дата, потому что нет «30» месяцев.

0 голосов
/ 03 октября 2010

Обычно даты - это символы, разделенные косой чертой вперед / назад или тире. Вы рассматривали регулярное выражение?

Я предполагаю, что вы не хотите классифицировать даты типа воскресенье, 3 октября 2010 г. и т. Д.

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