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)
:mrgreen:

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 :wink:
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

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. :D

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 . :oops:

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.