Page 1 sur 1

[R] Utilisation de StringRegExReplace

Posté : ven. 12 févr. 2010 11:46
par Adenadels
Peux-t-on remplacer le code ci-dessous par une seule ligne en utilisant StringRegExReplace ? (j'avoue ne pas trop comprendre encore le fonctionnement des regex).
Mon tableau (au départ une ligne texte) fait plus de 40 caractères, donc la boucle se ferait 40 fois...

Le but étant de taper un texte, et de le transformer pour donner les touches équivalentes pour un clavier qwerty...
par exemple un mot de passe bios, alors que le clavier est encore en qwerty... un mot de passe azure donnerait qwure
(à taper sur son clavier azerty)

Code : Tout sélectionner

For $i = 1 To $Array[0][0]
   $Qwerty = StringReplace($Texte, $Array[$i][0], $Array[$i][1])
Next
Merci

Re: [..] Utilisation de StringRegExReplace

Posté : ven. 12 févr. 2010 17:27
par Tlem
StringRegExpReplace comme sont nom l'indique au début, traite une chaine et non un tableau. Donc en la circonstance il ne vous amènera rien de plus car il faudra d'une manière ou d'une autre lire le tableau. ;)

Re: [..] Utilisation de StringRegExReplace

Posté : ven. 12 févr. 2010 18:21
par Adenadels
Comme je le disais, mal exprimé peut-être, je n'ai pas de tableau au départ, mais deux chaînes de caractère :
Soit
$Azerty = "AZERTYUIOP.....,;:..."
$Qwerty = "QWERTYUIOP....,Mm..."

Et le texte à modifier : $Texte = "quel texte a modifier"

Ce que je voudrais réalier, et je me suis rendu compte que mon script ne fonctionnerait pas (un A serait transformé en Q, mais par la suite le Q serait à nouveau transformé en A !!).

Et je me demandais si StringRegExReplace pouvait faire un truc genre
$Result = StringRegExReplace($Texte, $Azerty, $Qwerty)

$Result devrait être égal à "auel texte q ,odifier"

Remplacer dans la chaîne texte tous les éléments de $Azerty par ceux de $Qwerty (tous les A en Q, tous les Z en W etc..), et en une seule passe (pas de A en Q pour revenir de Q en A ensuite comme avec StringReplace et un tableau).

Donc, ma question à un spécialiste des expressions régulières (que je ne maîtrise pas du tout), est : est-ce que RegEx sait faire ça ?

Merci

Re: [..] Utilisation de StringRegExReplace

Posté : ven. 12 févr. 2010 21:22
par Tlem
Comme je vous l'ai dit, StringRegExReplace() ne peut vous aider dans ce cas, car cette fonction remplace une expression et non de multiples expressions ...

Si on s'en tient aux lettres, voici une solution :

Code : Tout sélectionner

$String = "AzERTYUIOPm"

$Azerty = "aAzZqQmMwW,,"
$Qwerty = "qQwWaA;;zZmM"
$aAzerty = StringSplit($Azerty, "")
$aQwerty = StringSplit($Qwerty, "")

For $i = 1 To $aAzerty[0]
    $String = StringReplace($String, $aAzerty[$i], $aQwerty[$i], default, 1)
Next

MsgBox(0, '', $String)
Si vous en voulez plus, alors complétez avec les autres caractères. :roll:

[R] Utilisation de StringRegExReplace

Posté : sam. 13 févr. 2010 05:59
par Adenadels
Dans votre exemple, le résultat n'est pas bon... seule la lettre m est changée, les autres sont revenues à leur état initial, parce que changées deux fois... comme chez moi.
Il va falloir traiter le string d'entrée en tant que tableau également !!

Voilà ce que ça donne :
► Afficher le texte
Dommage pour les expressions régulières (que je vais quand même tâcher d'étudier si je trouve un bon tuto).

Merci pour vos réponses

Re: [R] Utilisation de StringRegExReplace

Posté : sam. 13 févr. 2010 08:51
par Tlem
Effectivement, j'avais oublié l'histoire du chien qui ce mord la queue ...
Donc me revoici avec une nouvelle version bien plus logique.
► Afficher le texte
En effet, il faut impérativement traiter la chaine caractère par caractère, ce qui évite de modifier une lettre qui l'à déjà été ...

Re: [R] Utilisation de StringRegExReplace

Posté : sam. 13 févr. 2010 10:03
par Adenadels
Dans votre dernier exemple, qui évite l'usage des Array et le StringReplace, ce qui le rend certainemement plus rapide, il suffit de remplacer la ligne
If $Char = $aAzerty[$i] Then
par
If $Char == $aAzerty[$i] Then
Pour obtenir la différenciation majuscules/minuscules, et le tour est joué.

En plus, dans ce programme, il sufft de ne nommer que les caractères différents entre azerty et qwerty.

Merci pour toutes vos réponses et suggestions.

Et voilà le résultat : (édité pour tenir compte de la fonction de Tlem et la possibilité de traduire dans les deux sens)
► Afficher le texte

Re: [R] Utilisation de StringRegExReplace

Posté : sam. 13 févr. 2010 13:56
par Tlem
Oui, je connais l'utilisation de '==', mais dans votre cas, il faut comparer tous les caractères 1 par 1 et le changer par l'équivalent dans l'autre 'table'.

Si vous voulez gagner quelques micro-secondes, vous pouvez vérifier que le caractère à contrôler se trouve dans la chaine $Azerty, auquel cas on fait le traitement.
Mais je doute que vous votre chaine à convertir soit très longue. :roll:

Edit : Voilà quelque chose qui va mieux. ;)
http://www.autoitscript.fr/forum/viewto ... =21&t=4688