[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:
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:
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:
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) :cry:
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 :idea: car moi j'y vois plus très clair...
Merci d'avance ;)