[R] StringRegExpReplace et Eval

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 239
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] StringRegExpReplace et Eval

#1

Message 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)
Modifié en dernier par jpascal le lun. 17 août 2015 16:33, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#2

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#3

Message 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)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#4

Message par mikell »

Execute + Eval, c'est pas un peu "pourquoi faire simple quand on peut faire compliqué" ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#5

Message 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)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#6

Message 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)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#7

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#8

Message 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
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#9

Message par jchd »

Je me suis référé au sujet pour Eval()...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
jpascal
Niveau 6
Niveau 6
Messages : 239
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#10

Message 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
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#11

Message 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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
jpascal
Niveau 6
Niveau 6
Messages : 239
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#12

Message 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,
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#13

Message par mikell »

La postéthylocataracte est redoutable en cette mi-août ...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#14

Message 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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
jpascal
Niveau 6
Niveau 6
Messages : 239
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] StringRegExpReplace et Eval

#15

Message 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.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre