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

VBScript Discussion :

[VBScript | Expression Régulière] Récupérer la valeur de la chaine matchant une regex


Sujet :

VBScript

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut [VBScript | Expression Régulière] Récupérer la valeur de la chaine matchant une regex
    Bonjour,

    Je me bat encore avec les regex.

    J'aimerais récupérer la chaine de caractère qui match exactement ma regex.

    Or je me retrouve avec un comportement bizarre du match de ma regex

    Si je fais :

    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
    Set RegularExpressionObject = New RegExp
     
    dim Matches
    dim ValeurChaineExpReg
     
    dim strIso8859
    dim strWin1252
    dim strPourcent22
     
    strIso8859 = "%22%22%22%22=?iso-8859-1?q?application%22%22%22%22/pdf"
    strWin1252 = "urn:mimetype:handler:%22%22%22=?windows-1252?q?application%22%22%22/pdf"
    strPourcent22 = "<RDF:Description RDF:about=" & chr(34) & "urn:mimetype:handler:%22=windows-application%22/pdf" & chr(34)
     
    With RegularExpressionObject
       .Pattern = "(%22)*=windows-application(%22)*/pdf"
      .IgnoreCase = False
    End With
     
    MsgBox strIso8859
    MsgBox RegularExpressionObject.Test(strIso8859)
    Set Matches = RegularExpressionObject.Execute(strIso8859)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
     
    MsgBox strWin1252
    MsgBox RegularExpressionObject.Test(strWin1252)
    Set Matches = RegularExpressionObject.Execute(strWin1252)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
     
    MsgBox strPourcent22
    MsgBox RegularExpressionObject.Test(strPourcent22)
    Set Matches = RegularExpressionObject.Execute(strPourcent22)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
    Dans ce cas pas de soucis il match correctement strPourcent22 et je peux récupérer la chaine de caractère "%22=windows-application%22/pdf" qui est la chaine que je souhaite remplacer sans soucis.

    Mais il ne matchera que ce cas et pas les deux autres chaines de caractères

    Maintenant si je fais

    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
    Set RegularExpressionObject = New RegExp
     
    dim Matches
    dim ValeurChaineExpReg
     
    dim strIso8859
    dim strWin1252
    dim strPourcent22
     
    strIso8859 = "%22%22%22%22=?iso-8859-1?q?application%22%22%22%22/pdf"
    strWin1252 = "urn:mimetype:handler:%22%22%22=?windows-1252?q?application%22%22%22/pdf"
    strPourcent22 = "<RDF:Description RDF:about=" & chr(34) & "urn:mimetype:handler:%22=windows-application%22/pdf" & chr(34)
     
    With RegularExpressionObject
    ' Modification du Pattern 
      .Pattern = "(%22)*[\w\W]*application(%22)*/pdf"
      .IgnoreCase = False
    End With
     
    MsgBox strIso8859
    MsgBox RegularExpressionObject.Test(strIso8859)
    Set Matches = RegularExpressionObject.Execute(strIso8859)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
     
    MsgBox strWin1252
    MsgBox RegularExpressionObject.Test(strWin1252)
    Set Matches = RegularExpressionObject.Execute(strWin1252)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
     
    MsgBox strPourcent22
    MsgBox RegularExpressionObject.Test(strPourcent22)
    Set Matches = RegularExpressionObject.Execute(strPourcent22)
    for each match in Matches
    	ValeurChaineExpReg = match.value
    	MsgBox "chaine à remplacer :  " & ValeurChaineExpReg
    next
    Je peux matcher les trois chaines de caractère.
    Par contre lorsque j'essaye d'afficher ValeurChaineExpReg il m'affiche toute la chaine de caractère et pas seulement la chaine de caractère matchant uniquement la regex.

    En fait mon but serait de n'avoir qu'une seule expression régulière pour gérer correctement les chaines de caractère strIso8859, strWin1252, strPourcent22 et pour chacune d'elle récupérer la sous-chaine matchant correctement ma regex.

    Pourquoi dans le premier cas je n'ai pas de soucis et dans le deuxième cas en utilisant [\w\W]* (= n'importe quel type de caractère 0 ou n fois), il ne me permet pas d'extraire la chaine exacte matchant ma regex????

    Si qqn à une idée

    Merci d'avance

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Vous devriez écrire le pattern comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With RegularExpressionObject
    ' Modification du Pattern 
      '.Pattern = "(%22)*[\w\W]*application(%22)*/pdf"
      .Pattern = "(%22)+[\w\W]*application(%22)*/pdf"
      .IgnoreCase = False
    End With
    Une fois montré, ça s'explique, non?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour,

    Et un grand merci pour ton aide.

    Je suis entre temps partie sur une autre méthodologie, mais je garde quand même sous le coude cette regex qui fonctionne mais dont je ne saisit pas la nuance, avec celle que j'ai testé.

    Détail de ma Regex :

    (%22)*[\w\W]*application(%22)*/pdf

    (%22)* => le modele %22 présent 0 ou n fois
    [\w\W]* => 0 ou n fois n'importe quel caractère
    application => exactement la chaine de caractère 'application'
    (%22)* => le modele %22 présent 0 ou n fois
    /pdf => exactement la chaine de caractère '/pdf'

    Détail de ta Regex :

    (%22) => le modele %22 (je sais pas si il y a une notion de répétition)
    [\w\W]* => 0 ou n fois n'importe quel caractère
    application => exactement la chaine de caractère 'application'
    (%22)* => le modele %22 présent 0 ou n fois
    /pdf => exactement la chaine de caractère '/pdf'

    J'avoue ne pas voir la différence de traitement entre les deux Regex et pourtant ta solution permet bien de faire matcher ET de récupérer exactement la chaine de caractère matchant la Regex.

    Si tu peux éclairé ma lanterne sur cette subtilité je suis preneur, ayant encore des difficultés avec cette outil ultra puissant que sont les expressions régulières.

    Encore merci pour ton aide.

    Bonne journée

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour,

    Je viens de m'apercevoir que je me suis trompé en relevant ta Regex et que tu utilisait le caractère + après le premier modele soit :

    (%22)+[\w\W]*application(%22)*/pdf

    dont le détail est :

    (%22)+ => le modele %22 au moins une fois ou n fois
    [\w\W]* => 0 ou n fois n'importe quel caractère
    application => exactement la chaine de caractère 'application'
    (%22)* => le modele %22 présent 0 ou n fois
    /pdf => exactement la chaine de caractère '/pdf'

    le plus bizarre c que cette expression régulière fonctionne aussi bien que celle-ci :

    (%22)[\w\W]*application(%22)*/pdf

    La j'avoue comprendre encore moins la nuance

    bonne journée

  5. #5
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    [0] D'abord et avant tout, il faut savoir que (%22)*, (%22)+, [\w\W]* etc sont tous gourmands - terme technique, attention. Par conséquence une combinaison comme (%22)*[\w\W]* serait accordé tous les textes depuis le tout début jusqu'à le particule qui va paraître après cette combinaison. C'etait ce que vous avez observé, donc, ce n'est pas le bon pattern. Il faut prendre l'existence de %22 comme un signal de continuer à essayer d'accorder. Donc, il vous faut au moins (%22)[\w\W]* ou (%22)+[\w\W]* mais jamais (%22)*[\w\W]*.

    [1] Avec [0] bien compris, quelle est la différence entre (%22)[\w\W]* et (%22)+[\w\W]*?

    Prenons le texte de strWin1252:
    strWin1252 = "urn:mimetype:handler:%22%22%22=?windows-1252?q?application%22%22%22/pdf"
    [1.1] Le pattern
    (%22)+[\w\W]*application(%22)*/pdf
    [1.1.1] La particule (%22)+ (attention à sa gourmandise) va accorder le (sous-)texte:
    %22%22%22
    [1.1.2] La particule [\w\W]* (sa gourmandise n'est pas bien illustrée ici avec le texte original particulier) va accorder le (sous-)texte:
    =?windows-1252?q?
    [1.1.3] Le reste application(%22)*/pdf va accorder le (sous-)texte:
    application%22%22%22/pdf
    Par contre...

    [1.2] Le pattern
    (%22)[\w\W]*application(%22)*/pdf
    [1.2.1] La particule (%22) va accorder le (sous-)texte:
    %22
    [1.2.2] La particule [\w\W]* va accorder le (sous-)texte:
    %22%22=?windows-1252?q?
    [1.2.3] Le reste application(%22)*/pdf va accorder le (sous-)texte:
    application%22%22%22/pdf
    Voilà la mécanique du processus d'accorder et la différence.

Discussions similaires

  1. Expression réglière : Récupérer la valeur d'une balise xml
    Par ziad.shady dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 16/07/2012, 13h59
  2. Trouver une expression régulière pour les valeurs des noeuds XML
    Par Motin dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/10/2011, 17h51
  3. Expression régulière - récupérer les variables $1 $2
    Par fleurparis dans le forum VBScript
    Réponses: 2
    Dernier message: 16/12/2009, 16h20
  4. Expression régulière - Récupérer la valeur entre 2 balises
    Par redkan dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 28/02/2009, 14h46
  5. Réponses: 1
    Dernier message: 04/12/2007, 01h39

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