2016-04-27 3 views
1

J'ai différents formats d'heure qui entrent dans mon rapport. J'essaie de standardiser le format. Les deux que j'ai vus jusqu'à présent sont les suivants.Regex pour capturer l'horodatage dans différents formats

3. When: 150845Z - 161045Z Jan 16 
When: 15 08:45Z - 16 10:45Z Jan 16 

Mon but est de transformer ces données à partir de l'entrée ci-dessus dans les

suivants
Start date and time 01/15/2016 08:45 
End date and time 01/16/2016 10:45 

J'ai plusieurs groupes de capture et se divise pour y arriver et d'être aiguise il est assez grand et je pense ça peut être simplifié.

Je peux poster chaque étape de code que j'ai cependant que ce serait vraiment gonfler ce poste. Pour la date de début et je fais ce qui suit

(?s)(?<=^.When:\s)[a-zA-Z0-9]+ 

Pour la date et heure de fin, je fais ce qui suit

When:.+(?<=-)(\w.*) 

Je voudrais vraiment réduire cela autant que possible. J'ai essayé d'implémenter cette méthode Regex for capturing different date formats cependant je suis vraiment nouveau à Regex et pièce des articles ensemble jusqu'à ce que je l'obtienne au travail.

Merci

Informations supplémentaires

Je suis actuellement lié à l'utilisation Nintex Workflows pour transformer les données. Je voudrais commencer la capture après When:\s puis je peux utiliser [, :] pour supprimer les espaces et les deux-points restants. Cela laisserait les données dans un format que je peux manipuler.

+0

Votre [premier regex] (http://regexstorm.net/tester?p= (% 3fs) (% 3f% 3c% 3d% 5e.When% 3a % 5cs)% 5ba-zA-Z0-9% 5d% 2b & i = 3. + Quand% 3a + 150845Z + - + 161045Z + Jan + 16% 0d% 0aQuand% 3a + 15 + 08% 3a45Z + - + 16 + 10% 3a45Z + Jan + 16) ne fonctionne pas - qu'est-ce que vous avez l'intention de faire correspondre? Le second obtient juste la partie après '-': ne pourriez-vous pas séparer la chaîne? Ne devriez-vous pas vraiment chercher "Quand:", obtenir la sous-chaîne après et diviser avec "" - "' pour obtenir les pièces dont vous avez besoin? –

+0

C'est ce que je fais maintenant, mais ça ne marche pas très bien. Mon objectif est d'avoir les captures suivantes. 'Mois, date de début, date de fin, année, heure de début, heure de fin'. Je ne suis pas sûr de savoir comment diviser les données. – JeremyA1

+0

Voir d'abord [cette démo d'IDEONE] (http://ideone.com/uBqU6K). Est-ce que le fractionnement est OK? Si non, quelle sortie exacte voulez-vous obtenir? Ensuite, vérifiez cette [démo regex] (http://regexstorm.net/tester?p=%5e (% 3f% 3a% 5cd% 2b% 5c.% 5cs *)% 3fWhen% 3a% 5cs * (% 5cd% 7b2% 7d)% 5cs * (% 5cd% 7b2% 7d)% 3a% 3f (% 5cd% 7b2% 7dZ)% 5cs * -% 5cs * (. *) & I = 3. + Quand% 3a + 150845Z + - + 161045Z + Jan + 16% 0d% 0aLorsque% 3a + 15 + 08% 3a45Z + - + 16 + 10% 3a45Z + Jan + 16 & o = m). Est-ce mieux? –

Répondre

1

Vous pouvez utiliser

^.*?When:\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*-\s*(\d{2})\s*(\d{2}):?(\d{2}Z)\s*(\‌​w+)\s*(\d{1,2})$ 

et les remplacer par $1$2$3$4$5$6$7$8.

Voir la regex demo

Le point est de faire correspondre et de capturer ce que nous avons besoin et réintroduisez ces textes capturés à l'aide de références arrières ($n s) dans le modèle de remplacement et les pièces que nous correspondent tout sera retiré de la chaîne résultante.

Voici quelques détails pour que vous puissiez ajuster le modèle plus tard:

  • ^ - début de la chaîne/ligne (aucune idée si l'outil permet de faire correspondre plusieurs lignes)
  • .*? - Match 0+ caractères autres qu'un saut de ligne aussi peu que possible jusqu'à la première
  • When: - chaîne littérale When:
  • \s* - 0+ symboles blancs
  • (\d{2}) - 2 chiffres (groupe 1)
  • \s* - 0+ symboles blancs
  • (\d{2}) - 2 chiffres (Groupe 2)
  • :? - en option :
  • (\d{2}Z)
  • - 2 chiffres + Z (groupe 3)
  • \s*-\s* - 0+ whitepsaces, littéral - et 0+ espaces blancs
  • (\d{2})\s*(\d{2}):?(\d{2}Z)\s* - s ee ci-dessus (groupe 4, 5, 6)
  • (\‌​w+) - 1+ caractères de texte (lettres, chiffres, ou souligné) (groupe 7)
  • \s* - 0+ whitepsaces
  • (\d{1,2})-1 ou 2 chiffres (Group 8)
  • $ - fin de chaîne