2010-02-12 4 views

Répondre

-1

Voici deux questions, l'une concernant l'identification, l'autre conversion. L'identification d'un contexte de date possible est (relativement) facile, la conversion est cependant profondément problématique pour un certain nombre de raisons, notamment la grande variété de façons d'exprimer sémantiquement une date, et les ambiguïtés concomitantes et les fausses représentations qui peuvent émerger. Regardons quelques pièges évidents ici:

  • "Après-demain 14 heures." Si nous évaluons simplement sur "demain 14 heures" nous allons être un jour à la dérive.

  • « Deux jours après 16.10.2010 » .. Il y a pire ...

  • « peu avant 21 heures le vendredi 13 Mars 2013 » Nous pouvons retourner la date, mais le contexte rend très ambigu.

En supposant que vous voulez seulement identifier une correspondance de date potentielle dans une chaîne que vous pourriez faire quelque chose comme ça ...

private final String[] datePatterns = {"Yesterday","Today","Tomorrow", //etc 
     "Sunday","Monday","Tuesday","Thursday","Friday", // etc 
     "Lundi","Mardi","Mercredi", //etc in French 
     "2001","2002", // all the years 
     "AM","PM", 
     "January","February","March","August"}; 
private List lx = new ArrayList(); 


public boolean mayContainDates(String toCheck) 
{ 
toCheck = toCheck.toUpperCase(); 

// irl we'd build this list 1 time in the constructor 
for(int i = 0; i < datePatterns.length; i++) 
{ 
lx.add(datePatterns[i].toUpperCase()); 
} 

    Iterator lit = lx.iterator(); 

    while(lit.hasNext()) 
    {  
    if (toCheck.contains((String) lit.next()) 
    { 
    return true; 
    } 
    } 

    return false; 
} 

Il est vraiment une question de la façon dont vous configurez votre tableau datePattern Chaîne de comparateurs. Alternativement, vous pouvez répéter une série d'expressions rationnelles d'une manière un peu similaire, mais ce serait lent. Vous obtiendrez probablement beaucoup de faux positifs, mais vous pouvez évidemment améliorer ce modèle simple.

+0

Merci beaucoup pour votre réponse. Vous avez raison, l'identification de la date est plus difficile à traiter, et il me semble qu'une simple base de données basée sur la connaissance devrait aider – airlocker