Page 1 sur 1

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

Posté : jeu. 28 janv. 2016 19:05
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 ?

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

Posté : jeu. 28 janv. 2016 20:23
par orax
_WinAPI_IsNameInExpression n'irait pas ?

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

Posté : jeu. 28 janv. 2016 21:04
par Patrick22
Ben non. Elle n'accepte pas les caractères joker.

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

Posté : jeu. 28 janv. 2016 21:36
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:

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

Posté : jeu. 28 janv. 2016 21:45
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)

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

Posté : jeu. 28 janv. 2016 22:36
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] = "*"

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

Posté : jeu. 28 janv. 2016 23:40
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

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

Posté : ven. 29 janv. 2016 00:14
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.

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

Posté : ven. 29 janv. 2016 00:29
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 .?

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

Posté : ven. 29 janv. 2016 00:41
par orax
Oui en effet ! :oops: Je viens de corriger le code.

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

Posté : ven. 29 janv. 2016 00:47
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)