StringRegExpReplace avec fonction

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

StringRegExpReplace avec fonction

#1

Message par mdanielm »

Bonsoir à tous,
Quelqu'un connaît-il la syntaxe correcte à utiliser ci dessous?

[codeautoit]$ch = "bonjour,... toi"
$regex = '(\w+)([^\w]*)(\w+)'

$ch = StringRegExpReplace($ch, $regex, StringUpper("$1") & "$2" & "$3")

MsgBox(0, "", $ch)[/codeautoit]
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#2

Message par jguinch »

On ne peut pas utiliser de fonction de cette façon, en tout cas pas à ma connaissance.
Tu peux faire comme ça :
[codeautoit]$ch = "bonjour,... toi"
$regex = '(\w+)([^\w]*\w+)'

$ch = Execute(StringRegExpReplace($ch, $regex, "StringUpper('$1') & '$2'"))
MsgBox(0, "", $ch)[/codeautoit]
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#3

Message par orax »

J'ai été confronté à ce problème il y a peu de temps. Je voulais utiliser "\U" pour mettre en majuscule certains mots, comme dans le code ci-dessous.
[codeautoit]$ch = StringRegExpReplace($ch, "\w+", "\U\0")[/codeautoit]
Ça fonctionne dans Notepad++ [1], par contre, dans AutoIt, \U ne semble pas être pris en compte, et je n'avais pas trouvé d'équivalent pour faire ça.
Mais avec la solution de jguinch, tu devrais pouvoir faire la même chose.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#4

Message par mdanielm »

Merci,
Je cherche maintenant une solution pour le cas les groupes ne recouvrent pas la chaîne:
$ch = "<Bonjour,... toi !!!>"
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#5

Message par orax »

Là ça ne marche plus parce qu'Execute essaie d'exécuter <StringUpper('Bonjour') & ',... toi' !!!>.
On pourrait corriger le problème, mais j'ai voulu essayer une autre méthode.
Je me suis inspiré du code ici.

[codeautoit]#include <StringConstants.au3>

$ch = "<Bonjour,... toi !!!>"
$regex = '(\w+)[^\w]*\w+'

$iOffset = 1
Do
$aRes = StringRegExp($ch, $regex, $STR_REGEXPARRAYFULLMATCH, $iOffset)
If @error Then ExitLoop
$iOffset = @extended
$ch = StringReplace($ch, $iOffset - StringLen($aRes[0]), StringUpper($aRes[1]), 1, 1)
Until 0
ConsoleWrite($ch & @CRLF)[/codeautoit]
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#6

Message par mdanielm »

Bravo, c'est mieux.
Pour moi $ch a 10000 caractères, par exemple une page .htm de l'aide AutoIt et la fonction StringUpper est en fait une fonction perso complexe.
Ta solution fonctionne mais j'ai une autre idée sans boucle:
Comme j'ai plusieurs remplacement à faire avec la même fonction, je fais tous les remplacements en une fois par le nom de la fonction, puis en une fois avec StringReplace je remplace les noms de la fonctions par la valeur qu'elle retourne. pb de param?
Dès que j'ai le temps, je réfléchis mieux!.

Bonne journée
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#7

Message par jguinch »

[codeautoit]$ch = "<Bonjour,... toi !!!>"
$regex = '(\w+)([^\w]*\w+)'

$ch = Execute('"' & StringRegExpReplace(StringReplace($ch, '"', '""'), $regex, """ & StringUpper('$1') & ""$2") & '"')

MsgBox(0, "", $ch)[/codeautoit]
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: StringRegExpReplace avec fonction

#8

Message par mdanielm »

Je n ai pas d ordinateur sous la main pour apprecier mais c est spectaculaire.
Pourquoi pas une fonction StringRegExpReplace2($ch, $regex, 'MyFunc') ?
Ou MyFunc aurait autant de paramètres que de groupes de capture.
Exemple:
Func MyFunc($c1, $c2, $c3)
Return StringUpper($c1) & $c2 & StringReverse($c3)
endFunc
Répondre