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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    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

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    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 684
    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 684
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Super, merci beaucoup!!

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    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
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    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 ...

+ 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