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

JavaScript Discussion :

Modifier mon regex pour qu'il accepte les nombres négatifs [RegExp]


Sujet :

JavaScript

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Modifier mon regex pour qu'il accepte les nombres négatifs
    Bonjour
    Je constate que j'ai un gros problème avec un bon de code qui a fonctionner pendant quelques année: Il n'accepte pas les nombres néatif.
    Et pourquoi je ne l'ai jamais vu? ben parce que cet hiver je mesure la température extérieur alors qu'avant mon projet ne tournait qu0en été

    Le problème est le suivant. Les données sont envoyés avec LoRaWAN sous ce format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    6B343138702D313573313839
    ce qui donne
    k418p-15s189
    Les lettres servent à définir le capteur et les valeurs sont, ben les valeurs des capteur.
    On voit que le capteur p à une valeur négative.

    J'utilise ce code pour "décortiquer" ma ligne
    Code : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
    	var paire;
     
      var decoded = {}
      var te,pr,hu,lu,w1,w2,w3,da,ts,ga,ba,ar,an,it,wr,b1,b2,b3,b4;
      while (null !== (paire = regex.exec(astr[0]))) {
    		//console.log(paire[1]);
    		switch(paire[1]){
    		  case 'a':
    		    //console.log("te",paire[2]);
    		    te=paire[2];
    		    break;
    		  case 'b':
    		    //console.log("pr",paire[2]);
    		    pr=paire[2];
    		    break;
    		  case 'c':
    		    //console.log("hu",paire[2]);
    		    hu=paire[2];
    		    break;
    		  case 'd':
    		    //console.log("lu",paire[2]);
    		    lu=paire[2];
    		    break;
    		  case 'e':
    		    //console.log("w1",paire[2]);
    		    w1=paire[2];
    		    break;
    		  case 'f':
    		    //console.log("w2",paire[2]);
    		    w2=paire[2];
    		    break;
    		  case 'g':
    		    //console.log("w3",paire[2]);
    		    w3=paire[2];
    		    break;
    		  case 'h':
    		    //console.log("da",paire[2]);
    		    da=paire[2];
    		    break;
    		  case 'i':
    		    //console.log("ts",paire[2]);
    		    ts=paire[2];
    		    break;
    		  case 'j':
    		    //console.log("ga",paire[2]);
    		    ga=paire[2];
    		    break;
    		  case 'k':
    		    //console.log("ba",paire[2]);
    		    ba=paire[2];
    		    break;
    		  case 'l':
    		   // console.log("ar",paire[2]);
    		    ar=paire[2];
    		    break;
    		  case 'm':
    		   // console.log("an",paire[2]);
    		    an=paire[2];
    		    break;
    		  case 'n':
    		    //console.log("it",paire[2]);
    		    it=paire[2];
    		    break;
    		  case 'o':
    		    //console.log("wr",paire[2]);
    		    wr=paire[2];
    		    break;
    		  case 'p':
    		    //console.log("wr",paire[2]);
    		    b1=paire[2];
    		    break;
    		  case 'q':
    		    //console.log("wr",paire[2]);
    		    b2=paire[2];
    		    break;
    		  case 'r':
    		    //console.log("wr",paire[2]);
    		    b3=paire[2];
    		    break;
    		  case 's':
    		    //console.log("wr",paire[2]);
    		    b4=paire[2];
    		    break;
     
    		}
    		//resultats.push(paire);
    	}
     
      return {
        te:te,
        pr:pr,
        hu:hu,
        lu:lu,
        w1:w1,
        w2:w2,
        w3:w3,
        da:da,
        ts:ts,
        ga:ga,
        ba:ba,
        ar:ar,
        an:an,
        it:it,
        wr:wr,
        b1:b1,
        b2:b2,
        b3:b3,
        b4:b4,
      }
     
    }
    Si p est positif, soit 15, J'ai ce résultat avec cet hex (6B 34 31 38 70 31 35 73 31 38 39)
    {
    "b1": "15",
    "b4": "189",
    "ba": "418"
    }
    Par contre si p est négatif, j''ai ceci

    {
    "b4": "189",
    "ba": "418"
    }
    alors que je devrais évidemment avoir
    {
    "b1": "-15",
    "b4": "189",
    "ba": "418"
    }
    Je pense que c'est parce qu'il considere que - est un caractère, alors b, n'a plus de valeur.

    Je me demande alors comment je pourrais modifier mon regex pour le - fasse partie du nombre qui précède la lettre. Voyez vous?

    Je connais rien avec les regex. On m'avait aidé pour y arriver-

    Milles mercis pour vos lumières
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    je remplacerais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var regex = /([a-z]+)(\d+)/g;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var regex = /([a-z]+)(-?\d+)/g;
    en ajoutant un « zero or more » moins.

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Une proposition en décomposant pour le principe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var val ="k418p-15s189";
    var myreg=/([a-z](-?\d+))/g;
    var myreg2=/-?\d+/;
    parse = val.match(myreg);
     
    var i=-1;
    tab=[];
    while ( parse[++i]) {
    elt=parse[i].substr(0,1)
    tab[elt]= parse[i].match(myreg2)[0]
    }
     
    console.log(tab);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Et vu la configuration, ça aussi pourrait marcher:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const val ="k418p-15s189",
    paires=[],
    lettre=val.match(/[a-z]/g),
    nombre=val.match(/[^a-z]+/g);
    for(i in lettre){
    	paires[lettre[i]]=nombre[i]
    }
    console.log(m)

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Super, merci beaucoup!!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Et juste pour rire, si tes chaînes sont formées au poil:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const val ="k418p-15s189", tab=[];
    val.match(/[a-z]|[^a-z]+/g).map((v,i,t) => {if(i%2==0) m[v]=t[i+1]})
    console.log(tab)

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Petit correctif à ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const val ="k418p-15s189", tab={};
    val.match(/[a-z]|[^a-z]+/g).map((v,i,t) => {if(i%2==0) tab[v]=t[i+1]})
    console.log(tab)
    il manquerait toutefois la table de conversion: k -> ba, p -> b1 ...

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    il manquerait toutefois la table de conversion: k -> ba, p -> b1 ...
    Simple a mettre ne place avec un array de correspondance ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    c=[],
    c[k]="ba";
    c[p]="b1"
    ...
     
    tab[c[v]]
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Merci pour les retouches!

    Pour les conversions, je ne m'étais pas inquiété du problème; d'ailleurs, si les chaînes sont toutes composées ainsi, avec les 3 mêmes capteurs, on n'est même plus dans une logique de regexp et on peut sûrement simplifier l'ensemble;

  10. #10
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    En fait, pas si fluide que ça!

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const tab={};// objet vide
    let val ="k418p-15s189" // chaîne de départ
    .match(/[a-z]|[^a-z]+/g) // dont on fait un tableau comportant chaque élément "capteur" ou "valeur"
    .join(",")// qu'on reconvertit en chaîne
    .replace(/[kps]/g,(i)=>{return {k:"ba",p:"b1",s:"b4"}[i]})// où on traduit les noms des capteurs
    .split(",")// la chaîne est reconvertie en tableau
    .map((v,i,t)=>{if(i%2==0) tab[v]=t[i+1]})// converti en objet où les capteurs deviennent clés
    console.log(tab)// {ba: "418", b1: "-15", b4: "189"}

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/05/2019, 19h17
  2. Réponses: 0
    Dernier message: 29/05/2012, 12h01
  3. Réponses: 3
    Dernier message: 16/07/2007, 19h41
  4. Comment modifie une requete pour avoir des sommes?
    Par F@ce27 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/06/2006, 13h47
  5. [C# 1.1] Comment paramétrer mon regex correctement ?
    Par foolsky dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 04/05/2006, 17h24

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