Page 1 sur 1
StringRegExpReplace avec fonction
Posté : jeu. 30 juin 2016 20:00
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]
Re: StringRegExpReplace avec fonction
Posté : jeu. 30 juin 2016 21:55
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]
Re: StringRegExpReplace avec fonction
Posté : jeu. 30 juin 2016 22:32
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.
Re: StringRegExpReplace avec fonction
Posté : jeu. 30 juin 2016 23:47
par mdanielm
Merci,
Je cherche maintenant une solution pour le cas les groupes ne recouvrent pas la chaîne:
$ch = "<Bonjour,... toi !!!>"
Re: StringRegExpReplace avec fonction
Posté : ven. 01 juil. 2016 01:16
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]
Re: StringRegExpReplace avec fonction
Posté : ven. 01 juil. 2016 07:51
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
Re: StringRegExpReplace avec fonction
Posté : ven. 01 juil. 2016 15:43
par jguinch
[codeautoit]$ch = "<Bonjour,... toi !!!>"
$regex = '(\w+)([^\w]*\w+)'
$ch = Execute('"' & StringRegExpReplace(StringReplace($ch, '"', '""'), $regex, """ & StringUpper('$1') & ""$2") & '"')
MsgBox(0, "", $ch)[/codeautoit]
Re: StringRegExpReplace avec fonction
Posté : ven. 01 juil. 2016 21:35
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