IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement de jobs Discussion :

Comment normaliser des numéros de téléphones avec une expression régulière


Sujet :

Développement de jobs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut Comment normaliser des numéros de téléphones avec une expression régulière
    Bonjour,

    J'ai une question concernant l'emploi des expressions régulières dans un tMAP.

    J'ai une liste de numéro de téléphone en flux d'entrée ayant des formats divers :

    0610111213
    06 12 14 22 40
    03.40.55.66.77
    02/88/52/56/57
    06 / 01 / 02 / 03 / 04
    Je souhaiterais qu'en sortie de tMap, tous les numéros de téléphone aient le même format, à savoir 06 12 14 22 40

    J'ai procédé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).substring( 0 ,  2 ) + " " +
    FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).substring( 2 ,  4 ) + " " +
    FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).substring( 4 ,  6 ) + " " +
    FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).substring( 6 ,  8 ) + " " +
    FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).substring( 8 , 10 )
    Le replaceAll( "\\D" , "" ), enlève tous les caractères non numériques (astuce trouvée sur internet avec une expression régulière), et ensuite, je colle des sous-chaines de chaque couple de chiffres, séparés par un espace.

    Ca fait je job, mais je ne trouve pas ça jolie et je suis persuadé qu'en utilisant une expression régulière, je pourrais faire cela plus proprement. Le problème, c'est que je ne maitrise pas du tout les expressions régulières, et je ne sais comment procéder.

    Quelqu'un pourrait-il m'aider, SVP ?

    D'avance Merci pour vos futures réponses.

    GiDu

  2. #2
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    Je ferai une routine simplement

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
        public static String formatPhoneNumber(final String input, int splitBy,final String separator) {
            StringBuilder output = new StringBuilder();
            for (int i = 0 ; i < input.length() ; i++) {
                char currentChar = input.charAt(i);
                if (currentChar >= '0' && currentChar <= '9') {
                    if (output.length() > 0 && output.length() % (splitBy + separator.length()) == splitBy) {
                        output.append(separator);
                    }
                    output.append(currentChar);
     
                }
            }
            return output.toString();
        }
     
        public static String formatPhoneNumber(final String input) {
            return formatPhoneNumber(input, 2," ");
        }
        /*
        public static void main(String[] args) {
            System.out.println(formatPhoneNumber("0610111213"));
            System.out.println(formatPhoneNumber("06 12 14 22 40"));
            System.out.println(formatPhoneNumber("03.40.55.66.77"));
            System.out.println(formatPhoneNumber("02/88/52/56/57"));
            System.out.println(formatPhoneNumber("06 / 01 / 02 / 03 / 04"));
        }*/

    J'ai bien en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    06 10 11 12 13
    06 12 14 22 40
    03 40 55 66 77
    02 88 52 56 57
    06 01 02 03 04

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Merci pour votre proposition.

    Cependant, je cherche à réaliser quelque chose de plus simple qui utiliserai la fonction java replace avec une expression régulière, et qui formatterai le numéro d'un coup, sans multiplier les replace ou appeler une routine que j'aurai créé.

    Peut-être que je rêve et que ce n'est pas possible.

    Merci quand-même.

    GiDu

  4. #4
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    FLUX_ENTREE.TELEPHONE.replaceAll("[^\\d]","").replaceAll("(\\d\\d)"," $1").substring(1)

  5. #5
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Désolé d'avoir tardé à répondre, j'ai dû basculer sur un autre dossier plus urgent.

    Merci pour la réponse, ça fonctionne, et surtout ça fait plus classe comme développement.

    Néanmoins, je suis une bille en expression régulière, aussi serait-ce possible d'avoir quelques explications pour ma culture personnelle. Ce n'est pas tout de modifier le code, faut aussi que je le comprenne si un jour il doit évoluer.

    Voici ce que j'ai compris.

    Je devine, avec le 2nd replaceAll, que la suite de deux chiffres contigus "(\\d\\d)" est remplacée par un espace puis les deux chiffres " $1", mais $ signifie la fin de chaine et le 1, je ne sais pas. Comment interpréter cette partie de code.

    Pour le 1er replaceALL ^signifie le début de chaine, \\d un chiffre, et vous le remplacez par une chaine vide. Désolé, je ne parviens pas à comprendre.

    Quant au substring(1), là, je suis perdue.

    D'avance Merci pour toutes vos futures explications.

    GiDu

  6. #6
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    Citation Envoyé par supergeoffrey
    FLUX_ENTREE.TELEPHONE.replaceAll("[^\\d]","").replaceAll("(\\d\\d)"," $1").substring(1)
    replaceAll("[^\\d]","") supprime tous les caractères non décimaux. ^ veut dire "non".

    replaceAll("(\\d\\d)"," $1") $1 correspond à ce qui match dans les parenthèses, ça correspond au "group" 1 dans les Matcher de java, sans les parenthèses ça ne fonctionne pas.! Du coup je remplace deux décimales par un espace et ces deux décimales. Avec d'autres groupes de parenthèses en peut utiliser $2, $3...

    .substring(1) supprime l'espace en trop en début du numéro

    ça fait peut-être classe mais c'est difficilement compréhensible sans explication je suis d'accord. C'est pour cela que je préfère la routine

    La javadoc :
    https://docs.oracle.com/javase/7/doc...x/Matcher.html
    https://docs.oracle.com/javase/7/doc...x/Pattern.html

  7. #7
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    J'ajouterai même que le substring(1) et qu'il peut-etre remplacé par la substitution replaceAll("^ ?(.*)$","$1").

  8. #8
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Merci pour toutes ces explications, ainsi que de m'avoir consacré du temps.

    J'ai réalisé une petite variante :

    StringHandling.TRIM( FLUX_ENTREE.TELEPHONE.replaceAll( "\\D" , "" ).replaceAll( "(\\d\\d)" , " $1" ) )

    GiDu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récuperer des liens HTML avec une expression régulière
    Par magicvinni dans le forum Général Python
    Réponses: 2
    Dernier message: 16/02/2019, 17h18
  2. [Débutant] Comment composer un numéro de téléphone via une carte fax/modem
    Par JetLibre dans le forum VB.NET
    Réponses: 1
    Dernier message: 10/07/2015, 13h54
  3. Modifier des noms avec une expression régulière
    Par topor dans le forum VBScript
    Réponses: 3
    Dernier message: 16/07/2014, 11h34
  4. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 19h43
  5. Problème avec une expression régulière
    Par Darkroro dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo