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

C Discussion :

[Regex] "ou" dans l'exression et probleme de performance


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut [Regex] "ou" dans l'exression et probleme de performance
    Bonjour,

    Je développe un module Apache sensé parser du XML recupéré dans les données POST de la requête http. Une fois parsé, je dois recupérer les valeurs de 3 champs.

    La tête du XML est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="UTF-8"?><endbRequest xmlns="UdbEndbInterface" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EndbInterface C:\endbRequest.xsd">
         <Id>00000000000000000000</Id>
         <Code>23</Code>
         <Country-Code>33</Country-Code>
         <Area-Code>12345</Area-Code>
         <Location-Info>0000000000</Location-Info>
         <Vip>299876543</Vip>
         <Survip>12</Survip>
    </endbRequest>
    Les champs ont les spécifications suivantes :
    • Id : 20 alphanumériques
    • Code : 2 numériques
    • Country-Code : 2 numériques
    • Area-Code : 0 ou 5 numériques
    • Location-Info : 0 ou 10 numériques
    • Vip : 9 ou 10 numériques
    • Survip : entre 2 et 6 numériques


    Les champs à recupérer sont les champs AreaCode, Vip et Survip. Le champ Location-Info peut lui avoir une longueur de 0 ou 10 numériques

    Voici l'expression regulière que j'ai défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define EXP_REGU "<\?xml version=\"1\.0\" encoding=\"UTF-8\"\?.>
    <endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\.xsd\">
       <Id>[[:alnum:]]{20}</Id>
       <Code>[0-9]{2}</Code>
       <Country-Code>[0-9]{2}</Country-Code>
       <Area-Code>([0-9]{0}|[0-9]{5})</Area-Code>
       <Location-Info>\(|[[:digit:]]{10}\)</Location-Info>
       <Calling>([0-9]{9}|[0-9]{10})</Calling>
       <Called>([0-9]{2,6})</Called>
    </endbRequest>"
    Je l'utilise à l'aide des instructions suivantes, où buffer contient la chaine de charactères à traiter et regNumber est de type regex_t:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iRc=regcomp(&(newcfg->regNumber), EXP_REGU, REG_EXTENDED | REG_NEWLINE);
    ...
    iRc=regexec(&(s_cfg->regNumber), buffer, NBR_TOKEN, pMacht, 0);
    Mon expression regulière s'execute bien mais en un temps catastrophique (a peu près 100 fois plus lent que si le champs n'avait eu qu'une longueur de possible)

    Je pense être passé à coté de quelque chose et j'ai beau fouillé le man et google et je ne trouve pas d'indice.

    Si des gens ont une idée car moi j'y vois plus très clair...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Il sera beaucoup plus facile de t'aider si tu postes un code compilable, minimal, et reproduisant ton problème. En effet, avec le peu de code que tu donnes, il est difficile de te dire pourquoi tu constates des baisses de performances (d'ailleurs, as-tu pu les chiffrer précisément ?).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    Salut,

    J'ai trouvé la raison de mon problème...

    Tout d'abord, j'avais mal écrit mon expression regulière et l'utilisation des signes "\(" et "\)" pour entourer le "ou" fonctionner mal et devait plutôt être géré comme une référence arrière...

    En fait, j'ai changé de stratégie et décidé de recupérer la valeur de tout les champs et ensuite je ne traiter que ceux qui me sont utiles. Je peux donc utiliser les parenthèses de la manière suivante par exemple pour dire que le champ à une longueur de 0 ou alors de 20 numériques:

    Après moult recherches, il n'est apparement pas possible avec regex de spécifier un "ou" sans utiliser cette solution...

    Quant aux problèmes de performances, ils sont résolus et étaient en fait agravé fortement par l'appel d'un script pour envoyer un trap snmp indiquant l'erreur de parsage.

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

Discussions similaires

  1. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

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