Page 1 sur 1
[R] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 16:51
par jpascal
Bonjour,
Je souhaiterais afficher
Bonjour Toto à l'aide de ce script mais cela ne fonctionne pas. Pourquoi ?
Code : Tout sélectionner
$sNom = "Toto"
$sTxt0 = "Bonjour {Nom}"
$sTxt1 = StringRegExpReplace($sTxt0, '{(.*?)}', "s$1")
$sTxt2 = StringRegExpReplace($sTxt0, '{(.*?)}', Eval("s$1"))
MsgBox(0, 0, $sTxt1 & @CR & $sTxt2)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 18:40
par mikell
L'accolade est un caractère spécial donc il faut l'échapper avec un antislash
Eval ne sert qu'à retrouver une variable d'après son nom, pas très utile ici
Le $1 est une backreference, pas besoin de l'utiliser (ni de grouper d'ailleurs) puisque c'est son contenu que tu veux remplacer
Code : Tout sélectionner
$sNom = "Toto"
$sTxt0 = "Bonjour {Nom}"
; $sTxt1 = StringRegExpReplace($sTxt0, '\({.*?)}', $sNom) ; le groupe est inutile
$sTxt1 = StringRegExpReplace($sTxt0, '\{.*?}', $sNom)
$sTxt2 = StringRegExpReplace($sTxt0, '\{.*?}', Eval("sNom"))
MsgBox(0, 0, $sTxt1 & @CR & $sTxt2)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 18:56
par jchd
Ta variable, c'est sNom, pas Nom !
Code : Tout sélectionner
$sNom = "Toto"
$sTxt0 = "Bonjour {sNom}"
$sTxt1 = Execute("'" & StringRegExpReplace($sTxt0, "\{(.*?)\}", "' & Eval('$1')"))
MsgBox(0, 0, $sTxt1 & @LF)
Tu peux aussi faire comme ça :
Code : Tout sélectionner
AutoItSetOption("ExpandVarStrings", 1)
$sNom = "Toto"
$sTxt0 = "Bonjour $sNom$"
MsgBox(0, 0, $sTxt0 & @LF)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 18:56
par mikell
Execute + Eval, c'est pas un peu "pourquoi faire simple quand on peut faire compliqué" ?
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 19:07
par jchd
Ca ne fait pas la même chose : la variable ciblée est en paramètre dans le texte et non dans le code.
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt0 = "Bonjour {civilite} {prenom} {nom}, "
$sTxt1 = Execute("'" & StringRegExpReplace($sTxt0, "\{(.*?)\}", "' & Eval('$1') & '") & "'")
MsgBox(0, 0, $sTxt1 & @LF)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 19:16
par jchd
jchd a écrit :Ca ne fait pas la même chose : la variable ciblée est en paramètre dans le texte et non dans le code.
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt0 = "Bonjour {civilite} {prenom} {nom}, "
$sTxt1 = Execute("'" & StringRegExpReplace($sTxt0, "\{(.*?)\}", "' & Eval('$1') & '") & "'")
MsgBox(0, 0, $sTxt1 & @LF)
Mais bien sûr, ceci est plus simple :
Code : Tout sélectionner
AutoItSetOption("ExpandVarStrings", 1)
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt0 = "Bonjour $civilite$ $prenom$ $nom$, "
MsgBox(0, 0, $sTxt0 & @LF)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 20:02
par mikell
Et ceci encore plus
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt0 = "Bonjour "
MsgBox(0, 0, $sTxt0 & $Civilite & " " & $PreNom & " " & $Nom & ",")
Mais évidemment tout ça dépend du contexte d'utilisation
Sinon ben ya aussi ça
Code : Tout sélectionner
Local $a[] = [3, "Madame", "Gertrude", "Tartemolle"], $i = 0
$sTxt0 = "Bonjour {} {} {},"
$res = Execute( StringRegExpReplace("'" & $sTxt0 & "'", "\{.*?}", _
"' & $a[Execute(Assign(""i"", Eval(""i"")+1) * Eval(""i""))] & '") )
MsgBox(0, 0, $res)

Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 21:13
par jguinch
Comme le disait Mikell, Eval n'est pas nécessaire ici
Du coup, on peut ajouter un petit StringReplace pour gérer le cas de figure où la chaîne contient des quotes :
► Afficher le texte
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt = "Bonjour {civilite} {prenom} {nom}"
$sNewTxt = Execute("'" & StringRegExpReplace(StringReplace($sTxt, "'", "''"), '\{([\w]+)\}', "' & \$$1 & '") & "'")
MsgBox(0, '', $sNewTxt)
Re: [..] StringRegExpReplace et Eval
Posté : ven. 14 août 2015 23:55
par jchd
Je me suis référé au sujet pour Eval()...
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 12:06
par jpascal
Bonjour à tous.
Un grand merci pour vos réponses très enrichissantes.
Grâce à vous ce n'est pas une mais deux nouvelles choses que j'ai apprises sur AutoIt :
- la fonction Execute()
- l'option ExpandVarStrings
Si je comprends bien, il est inutile d'utiliser Eval dans un Execute, je vais donc utiliser le code suivant :
Code : Tout sélectionner
Execute("'" & StringRegExpReplace($sTxt0, '\{([\w]+)\}', "' & \$s$1 &'") & "'")
Concernant l'option ExpandVarStrings, j'imagine que la contrepartie d'une simplification du code est :
- un ralentissement de l'exécution du code
- une sécurité moindre
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 12:45
par jchd
Eval n'est pas inutile, simplement différent :
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt = "Bonjour {civilite} {prenom} {nom}, {adresse}"
$sNewTxt = Execute("'" & StringRegExpReplace(StringReplace($sTxt, "'", "''"), '\{(\w+)\}', "' & \$$1 & '") & "'")
MsgBox(0, 'Sans Eval()', $sNewTxt)
$sNewTxt = Execute("'" & StringRegExpReplace(StringReplace($sTxt, "'", "''"), "\{(\w+)\}", "' & Eval('$1') & '") & "'")
MsgBox(0, 'Avec Eval()', $sNewTxt)
Pour tes dernières remarques concernant ExpandVarStrings, on n'a rien sans rien, c'est un choix à faire. Note bien que tu peux n'activer l'option que lorsque tu en as besoin, donc réduire très fortement le risque de remplacements inopinés.
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 15:50
par jpascal
Désolé mais je n'arrive pas à comprendre pourquoi jchd, lorsque j'exécute ton code, la première boîte m'affiche un
message vide .
J'aurais pensé qu'il m'afficherait
Bonjour Madame Gertrude Tartemolle,
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 16:14
par mikell
La postéthylocataracte est redoutable en cette mi-août ...
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 16:22
par jchd
C'est parce qu'alors la chaîne n'est pas digérable par Execute :
Code : Tout sélectionner
$Civilite = "Madame"
$Prenom = "Gertrude"
$Nom = "Tartemolle"
$sTxt = "Bonjour {civilite} {prenom} {nom}, {adresse}"
Local $s = "'" & StringRegExpReplace(StringReplace($sTxt, "'", "''"), '\{([\w]+)\}', "' & \$$1 & '") & "'"
ConsoleWrite($s & @LF)
$sNewTxt = Execute($s) ; la variable $adresse n'existe pas
ConsoleWrite(@error & @LF)
MsgBox(0, 'Sans Eval()', $sNewTxt)
$sNewTxt = Execute("'" & StringRegExpReplace(StringReplace($sTxt, "'", "''"), "\{(.*?)\}", "' & Eval('$1') & '") & "'")
MsgBox(0, 'Avec Eval()', $sNewTxt)
Ici, Eval traite chaque variable séparément, donc l'erreur ne porte pas sur l'ensemble de la chaîne.
Re: [..] StringRegExpReplace et Eval
Posté : lun. 17 août 2015 16:32
par jpascal
Moralité, la fonction Eval() a bien une utilité en utilisation conjointe de la fonction Execute().
Et donc pour éviter le risque d'erreur, je la préfèrerai à l'utilisation de \$
Merci encore.