[R] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

[R] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#1

Message par Patrick22 »

Bonjour,
Je suis revenu vers AutoIt pour faire une fonction listant les dossiers et sous-dossiers d'un site accédé via le ftp.
Jusque là tout va bien, ma fonction "fonctionne" :)

Voulant l'enrichir, je veux y inclure un masque de recherche avec les caractères jokers "*" et "?".
Le traitement de ce masque commence par un découpage identifiant les groupes entre les "*" et les "?".
Une expression régulière me semble adaptée. Elle me permet, contrairement au StringSplit, de connaître à la fois les chaînes de caractères du masque et les caractères joker l'encadrant.

J''utilise ce pattern dans l'expression régulière : "(\*|\?)(.*?)(\*|\?)". Je ne sais pas s'il est optimum, il y a pas de mal de temps que je n'ai plus fait de RegEx, et, comme beaucoup de monde, je ne les utilisais pas fréquemment.

Mon problème vient de ce que cette formulation ne me donne pas tout.
Par exemple, pour la chaîne "Mon fichier.txt" et le masque "*fic?er?t*", j'obtiens "*fic?" et "?t*" mais je n'obtiens pas la sous-chaîne "?er?". La borne de fin du 1er groupe trouvé n'est pas réutilisée pour l'obtention du suivant.
J'ai passé une bonne partie de l'après-midi dessus sans rien trouvé, ni par moi-même, ni avec l'aide, ni sur le net. :( :mrgreen:

Quelqu'un pourrait-il me donner un coup de pouce et m'éclairer sur ce qui manque à ce pattern, SVP ?
Modifié en dernier par Patrick22 le ven. 29 janv. 2016 00:50, modifié 3 fois.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#2

Message par orax »

_WinAPI_IsNameInExpression n'irait pas ?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#3

Message par Patrick22 »

Ben non. Elle n'accepte pas les caractères joker.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#4

Message par jguinch »

$sString The string to be compared against the pattern. This string cannot contain wildcard characters.
$sPattern The pattern string. This string can contain wildcard characters.

Je vois pas le problème... :roll:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#5

Message par mikell »

J'avoue ne pas bien comprendre le but du truc, mais peut-être ça ?

Code : Tout sélectionner

#Include <Array.au3>

$str = "*fic?er?t*"

$res = StringRegExp(StringRegExpReplace($str, '[\*\?]', "$0$0"), '([\*\?][^\*\?]+[\*\?])', 3)
_ArrayDisplay($res)
" 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
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#6

Message par Patrick22 »

jguinch - J'ai essayé avec mon exemple et çà ne marche pas. Pas étonnant non plus vu que je suis sous XP et qu'il faut au moins Win7 :lol:

mikell - J'ai essayé aussi et çà marche. C'est juste que les caractères joker ne sont pas différenciés mais bon il suffit de prendre le 1er et le dernier caractère de chaque groupe. Merci.

Je n'ai pas été très clair peut-être. Je vais ré-eesayer :

La fonction reçoit un paramètre, le masque. Par exemple $sMsk = "*fic?er?t*"
A chaque lecture d'un nom de fichier du serveur ftp elle compare le nom de ce fichier avec le masque.
Par exemple elle traite le fichier $sFic = "Mon fichier.txt"
Il faut alors vérifier qu'il match avec le masque, c-a-d : n caractères suivi de "fic", puis 1 caractère après, puis "er", puis 1 caractère, puis "t" et enfin n caractères.

Je ferai pour cela un algorithme, pas évident mais faisable je crois, avec peut-être une regexp paramétrée, mais il me faut la structure détaillée du masque. D'où mon idée d'utiliser une regexp pour en obtenir les éléments significatifs en table comme :
$a[0] = "*" ; $a[1] = "fic" ; $a[2] = "?" ; $a[3] = "er" ; $a[4] = "?" ; $a[5] = "t" ; $a[6] = "*"
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#7

Message par orax »

$sFic = "Mon fichier.txt"
$sMsk = "*fic?ier?t*"
$r = _recherche($sFic, $sMsk)
ConsoleWrite($r & @CRLF)

Func _recherche($str, $sMsk)
   $sMsk = StringRegExpReplace($sMsk, "(?i)([^*?\w])", "\\$1")
   $sMsk = StringReplace($sMsk, "*", ".*")
   $sMsk = StringReplace($sMsk, "?", ".")

   Return StringRegExp($str, "(?i)" & $sMsk)
EndFunc   ;==>_recherche
Modifié en dernier par orax le ven. 29 janv. 2016 00:40, modifié 1 fois.
Raison : Correction d'après la remarque de jchd.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#8

Message par Patrick22 »

Alors là orax, bravo :o et merci :D :wink:
Clair, précis, propre et net.

Vu mon délaissement des RegEx voila qui m'a fait gagner quelques heures de boulot.
J'espère faire aussi propre avec ma fonction DirFtp, que je vais pouvoir terminé et testé.

Encore merci.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#9

Message par jchd »

Ce n'est pas tout à fait correct. Le "joker" ? remplace exactement un caractère, il n'est pas optionnel comme *.

Le joker DOS (ou FTP) * se traduit bien en regex par .* mais ? doit se traduire par . tout simplement et non .?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#10

Message par orax »

Oui en effet ! :oops: Je viens de corriger le code.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] RegExp : Réinclure les bornes de fin de chaîne trouvée comme début de la chaîne suivante

#11

Message par Patrick22 »

Ah oui. Exact. :shock:

J'ai testé avec :
$sFic = "Mon fichier.txt"
$sMsk = "*fic?ier?t*" puis avec $sMsk = "*fic??ier?t*"
La fonction retourne Vrai dans les deux cas alors que pour le 2ème masque il n'y a pas concordance.
En remplaçant ".?" par "." ça fonctionne bien et pour le 2ème masque la fonction renvoie Faux.

Merci à toi aussi jchd. 8)
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Répondre