2015-09-19 1 views
0

J'ai la chaîne suivante contenant une date et l'heure, que je dois analyserparser cette chaîne de date heure avec regex

« by username on September 13, 2015, 08:34:02 am »

je l'expression suivante qui semble fonctionner dans rubular.com mais Java uniquement en récolte septembre.

Je voudrais aussi avoir deux groupes, la date et l'heure. Comment puis-je faire ceci?

January|February|March|April|May|June|July|August|September|October|November|December| [0-9]{2}, [0-9]{4}, [0-9]{2}:[0-9]{2}:[0-9]{2} am|pm

Merci

+0

Pourquoi ne pas essayer juste et utiliser ce que l'API Java fournit le temps? Si vous n'utilisez pas Java 8, utilisez threetenbp – fge

+0

[Natty Date Parser] (http://natty.joestelmach.com/try.jsp#) fonctionne bien aussi. –

Répondre

3

On pourrait essayer quelque chose comme ça

String in = "by username on September 13, 2015, 08:34:02 am"; 
     //date parsing pattern 
    String s = "MMM d, yyyy, HH:mm:ss aaa"; 
    SimpleDateFormat sdf = new SimpleDateFormat(s, Locale.US); 
    try { 
     //pattern to get rid of 'by username on' 
     String p = "\\w+\\s\\w+\\s\\w+\\s"; 
     Date d = sdf.parse(in.replaceFirst(p, "")); 
     System.out.println(d); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
+0

C'est à mon humble avis de loin la meilleure approche. Je n'utiliserais pas regex quand il y a une solution robuste qui les évite. C'est beaucoup plus lisible et maintenable ... – Kejml

+0

Merci .. Je ne sais pas pourquoi mais j'ai enlevé «et». Ceux-ci sont à chaque extrémité du message. Comment puis-je les supprimer également en utilisant le motif? – conor

+1

@conor Faites-le en deux étapes: Chaîne p = "" \\ w + \\ s \\ w + \\ s \\ w + \\ s "; \t \t \t dans = in.replaceFirst (p, ""); \t \t \t Date d = sdf.parse (in.replaceFirst ("" "," ")); – Kennet

0

Essayez celui-ci.

((?:January|February|March|April|May|June|July|August|September|October|November|December)\s[0-9]{2},\s[0-9]{4}),\s([0-9]{2}:[0-9]{2}:[0-9]{2}\sam|pm)

Testée sur votre expression, il saisit à la fois date et l'heure en groupes séparés.

0

Si la date est toujours saisie exactement au même format, vous pouvez utiliser une fonction comme celle-ci. Si vous attendez plus d'espaces entre les parties, ajoutez \s+ (échappé comme \\s+ dans la chaîne Java).

public static Date findAndParseDate(String s) { 
    Date parsedDate = null; 
    String patternStr = "((January|February|March|April|May|June|July|August|September|October|November|December) [0-9]{2}, [0-9]{4}, [0-9]{2}:[0-9]{2}:[0-9]{2} am|pm)"; 
    Pattern p = Pattern.compile(patternStr); 
    Matcher m = p.matcher(s); 
    if (m.find()) { 
     String extractedDateTimePart = m.group(1); 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy, hh:mm:ss aa"); 
     try { 
      parsedDate = simpleDateFormat.parse(extractedDateTimePart); 
     } catch (Exception ex) { 
     } 
    } 
    return parsedDate; 
}