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 :

Expressions régulières : problème de pattern dynamique


Sujet :

VBScript

  1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut Expressions régulières : problème de pattern dynamique
    bonjour,
    il y a près de deux ans, j'avais déposé un exemple de lecture/écriture de fichier INI utilisant l'objet RegExp qui donne un code très compact
    je viens de découvrir que cet exemple n'acceptait pas les caractères [ ou ] dans les valeurs de clés... c'est tordu mais c'est comme ça
    pour cette 2ème version les supportant, je n'ai pas trouvé de pattern statique me permettant d'extraire directement la totalité de la section recherchée et seulement celle-ci
    j'ai dû me rabattre sur un pattern dynamique en fonction de l'index de la section recherchée et je ne récupère la section que par une sous-correspondance
    le code est fonctionnel mais il doit exister une solution plus efficace et plus élégante pour remplacer les lignes 26 à 35 du code ci-dessous :
    je suis ouvert à toutes suggestions des spécialistes des expressions régulières

    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
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
    Set oFile = fso.GetFile("test.ini")
    msgbox WriteReadIni(oFile,"H2","key5",Null)
    msgbox WriteReadIni(oFile,"H3","tag",Null)
    msgbox WriteReadIni(oFile,"H4","key10",Null)
    'rep = WriteReadIni(oFile,"H3","keyxy","]ghghg[s")
     
    Function WriteReadIni(oFile,section,key,value)
    ' écrit/lit la clé <key> de section <section> de l'objet fichier oFile avec la valeur <value> si lecture : value = Null 
    ' en écriture si la section et/ou la clé n'existent pas, elles seront créées
    ' en écriture renvoie toujours vrai, en lecture renvoie soit : la valeur de clé, une chaine vide en cas de clé vide ou Faux si la clé n'existe pas
    Dim oText,iniText,sectText,newSectText,keyText
    ' Initialisation des objets regexp
    ' peut être déplacé dans le code principal en cas d'appels successifs
      Set reg = New RegExp
      Set regSub = New RegExp
      reg.IgnoreCase = True
      reg.MultiLine=True
      regSub.IgnoreCase = True
      ' lecture du fichier ini et fermeture
      Set oText = oFile.OpenAsTextStream(1,0)
      iniText = oText.ReadAll
      oText.Close
      '*************************************************** 
      reg.Global=True
      reg.Pattern = "^\[(.+)\]"
      Set Matches=reg.Execute(iniText)
      iC=Matches.Count
      For Each Match In Matches
        iC=iC-1
        If Match.SubMatches(0)=section Then Exit For
      Next
      reg.Global=false
      reg.Pattern = "^\[" & section & "\]((.|\n)+)((\n\[(.|\n)+){"&iC&"})" ' quid pattern statique?
      '***************************************************
      regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]*)" 'pas de clé multiline
      On Error Resume Next
      If IsNull(value) Then   ' lecture clé
        ' Set Matches=reg.Execute(iniText)	A SUPPRIMER
        WriteReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
        If Err.Number = 5 then WriteReadIni = False
      Else						        ' écriture clé
        sectText = reg.Execute(iniText).Item(0).SubMatches(0)
        nextText = reg.Execute(iniText).Item(0).SubMatches(2) ' le reste du fichier après la section trouvée ->conseq submatch
        If Err.Number = 5 Then ' section inconnue elle est ajoutée en fin de fichier
          iniText = iniText & vbCrLf & "[" & section & "]" & vbCrLf & key & "=" & value
        Else ' la section existe on tente de remplacer la clé
          newSectText = regSub.Replace(sectText,key & "=" & value)
         If newSectText = sectText Then ' pas de remplacement opéré, la clé n'existe pas donc on l'ajoute en fin de section
           If Right(sectText,1) = vbCr Then keyText = key & "=" & value Else keyText = vbCrLf & key & "=" & value
           newSectText = sectText & keyText
         End If
         ' remplacement de la section ancienne par la section maj
         iniText = reg.Replace(iniText,"[" & section & "]" & newSectText & nextText)
        End If
        ' msgbox iniText
        ' écriture du fichier ini mis à jour
        Set oText = oFile.OpenAsTextStream(2,0)
        oText.Write iniText
        oText.Close
        WriteReadIni = True
      End If
    End Function
    le fichier test.ini à placer dans le même répertoire que le code vbs :
    [H1]
    key1=val1
    key2=val2
    key3=[aga]
    [H2]
    key5=12 ;comment
    key6=HJUY
    [H3]
    key7=val5
    keyx=[KKK]
    key8=val6
    [H4]
    key9=klm
    key10=[kiik]
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

Discussions similaires

  1. recherche d'expression régulière - problème
    Par cokoraly dans le forum Général Python
    Réponses: 7
    Dernier message: 03/11/2011, 14h10
  2. Expressions régulières : problème
    Par Liiinz dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2011, 17h23
  3. Réponses: 1
    Dernier message: 23/06/2011, 18h34
  4. Expressions régulières en Java,Pattern et Matcher
    Par Malatok dans le forum Général Java
    Réponses: 8
    Dernier message: 08/09/2010, 15h08
  5. [RegEx] Expressions régulières : problème avec e-mail
    Par webrider dans le forum Langage
    Réponses: 7
    Dernier message: 28/08/2006, 10h30

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