2009-06-30 3 views
1

Je reçois des confirmations de voyage qui ressemblent à ceci: "SQ 966 E 27JUL SINCGK" = "Airline Space Flight Space BookingClass Space Date_with_Month_as_name Space 3LetterFrom 2LetterTo". Je peux couper tout cela en morceaux en utilisant une regex pour le soumettre à un site Web. Mais le site attendrait au lieu du 27JUL 27/07/2009 ou au moins le 27/07. Existe-t-il un moyen de transformer un résultat d'expression régulière en fonction d'une pièce dans l'entrée. Jan -> 01, fév -> 02 ... Dec -> 12.Transformer une date en utilisant une expression régulière de 24Dec à 24/12 ou 24/12/2009

(saveur Regex est Java)

+0

N'est-ce pas un '3LetterTo' plutôt qu'un '2LetterTo'? Sinon, vous avez une lettre non comptabilisée dans l'échantillon strin. –

+0

vous avez raison 3LetterTo – stwissel

Répondre

1

Dans la syntaxe Perl (s{pattern}{replacement}):

s{([0-9][0-9])JAN}{\1/01} 
s{([0-9][0-9])FEB}{\1/02} 
s{([0-9][0-9])MAR}{\1/03} 
s{([0-9][0-9])APR}{\1/04} 
s{([0-9][0-9])MAY}{\1/05} 
s{([0-9][0-9])JUN}{\1/06} 
s{([0-9][0-9])JUL}{\1/07} 
s{([0-9][0-9])AUG}{\1/08} 
s{([0-9][0-9])SEP}{\1/09} 
s{([0-9][0-9])OCT}{\1/10} 
s{([0-9][0-9])NOV}{\1/11} 
s{([0-9][0-9])DEC}{\1/12} 

(Oui, c'est long et laid, mais il serait probablement).

+0

ne serait-ce pas s {([0-3] [0-9]) Monthname} {....? – stwissel

+0

l'identifiant S {} {} de Perl? (Je ne connais pas Perl). Donc, il n'y aurait pas de masquage/remplacement "natif" dans RegEx? – stwissel

+0

Oui, il s'agit de 12 opérations distinctes de recherche et de remplacement. Chacun fait un mois. – user9876

5

DateFormat est une classe plus appropriée:

DateFormat output = new SimpleDateFormat("dd/MM", Locale.US); 
DateFormat input = new SimpleDateFormat("dd MMM", Locale.US); 
System.out.println(output.format(input.parse("24 Dec"))); 

sortie:

 
24/12 
+0

Je suis au courant de Java Dateformat. Malheureusement, je ne peux pas changer les parties Java du système et tout ce que je peux manipuler l'expression rationnelle qui extrait les données. – stwissel

+0

comme vous pouvez le voir J'ai utilisé DateFormat pour analyser (comme regex) – dfa

0

Ce n'est pas une solution regex, mais vous pouvez utiliser SimpleDateFormat pour vous aider avec votre mise en forme finale. Vous devriez noter dans JavaDoc que ce n'est pas une option thread-safe prête à l'emploi.

Vous pouvez également utiliser DateFormatSymbols.getShortMonths() et parcourir pendant des mois pour identifier l'index * et formater votre chaîne manuellement.

* Ne pas oublier d'ajouter 1;)

modifier:

Je ne sais pas ce que vous cherchez est possible en Java regex sans ablility pour modifier le code. Les constructions conditionnelles prises en charge par Perl ne sont pas prises en charge par Java car Java fournit un support if-then-else en tant que fonctionnalité de langage.

+0

Désolé. Je ne peux pas toucher les parties Java de ce système, seule la regex peut être configurée. – stwissel

+0

Dommage. À moins que ce soit une application avec des jarres scellés, vous devriez être en mesure de mettre un pot devant le classpath, avec une version redéfinie de la classe gênante. Juste pour vous donner une arme de plus contre les mauvaises données :) –

0

Je ferais très attention à faire cela avec des expressions régulières car elles ne vous disent pas comment la conversion s'est déroulée.

Extrayez chaque bit d'information manuellement. Sanity vérifier tout, et puis utiliser l'analyseur SimpleDateFormat pour obtenir un objet Date que vous pouvez utiliser à partir de là.

+0

yep. Regex sont amusants. Ils pourraient probablement résoudre la faim dans le monde si un nombre suffisant de personnes les comprendrait. Mon défi: l'expression régulière est dans un paramètre de configuration d'un système que je ne peux pas toucher autrement. – stwissel

+0

Les expressions rationnelles ne peuvent pas conserver l'état de récurrence. Essayez simplement de faire une validation HTML avec un. Mais pour répondre à votre question correctement, vous devez être très précis sur ce que vous avez disponible, et comment cela peut être corrigé.Notamment, l'implémentation du moteur de regexp est importante - celle de la bibliothèque d'exécution est beaucoup moins performante qu'un moteur d'expressions rationnelles Perl complet. –

+0

@ Thorbjørn: C'est un produit écrit en Java (et je n'ai pas accès au code source). Ce que je peux faire est de configurer un Regex et mapper les groupes résultants aux champs dans les systèmes cibles (par exemple un formulaire Web ou une table de base de données) Tout ce que je peux faire doit "arriver" dans la chaîne regex. ... et merci de passer du temps là-dessus. – stwissel