[R] StringRegExp, récupération d'extension

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

[R] StringRegExp, récupération d'extension

#1

Message par yoyox »

Bonjour, je bloque actuellement sur une chaine au quel je souhaiterais extraire que l'extension et enlever les guillemets de la fin, mais je n'y arrive pas

Voici la ligne :
"c:\test.test\test\test.docx"
Voici la partie RegExp

Code : Tout sélectionner

(?:\.[^""]+)
Ça fonctionne si dans la chaine il n'y a qu'une fois le point, en revanche si il y en a plusieurs ça bloque
Auriez-vous une solution concernant cela

Je me sert de ce site :
https://regex101.com
Modifié en dernier par yoyox le sam. 09 mai 2015 00:37, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#2

Message par orax »

Code : Tout sélectionner

#include <StringConstants.au3>
ConsoleWrite(StringRegExp('"c:\test.test\test\t.e.st.docx"', '.+\K(\.[^"]+)(?="$)', $STR_REGEXPARRAYMATCH)[0] & @CRLF) ; avec cette syntaxe si la chaîne n'est pas trouvée il y aura une erreur
ConsoleWrite(StringRegExpReplace('"c:\test.test\t.e.st\te.st.docx"', '.+(\.[^"]+)"$', '\1') & @CRLF)
Par contre je ne sais pas pourquoi t'avais mis 2 ". [^"] est identique à [^""]
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#3

Message par jguinch »

@orax : le \K ne sert que pour un replace, donc inutile dans ce cas. L'assertion look-ahead n'était pas nécessaire non plus (mais fait le boulot quand même :wink: ) :P
.+(\.[^"]+)"$ avec l'option $STR_REGEXPARRAYMATCH devrait être suffisant pour le premier, ou même (\.[^."]+)"$

Pour éviter l'erreur en cas de chaîne non trouvée, une technique consiste à retourner une valeur vide en utilisant () à la fin :

Code : Tout sélectionner

ConsoleWrite(StringRegExp('"c:\test.test\test\t.e.st."', '(\.[^."]+)"$|()$', 1)[0] & @CRLF) ; match une extension, ou rien


yoyox avait doublé des double-quotes parce qu'il à utilisé les doubles quotes pour l'expression (alors que tu en as mis des simples)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#4

Message par ZDS »

Bonjour,

J'aurais fait plus simple, car l'extension correspond dans ton cas d'usage à "Tout ce qui n'est pas un point, entre le dernier point et le guillemet final", ce qu'on traduit en Regexp par \.([^\.]*)"$

Code : Tout sélectionner

Local $results = StringRegExp('"C:\Test.test\test\fichier.docx.rar"', '\.([^\.]*)"$', 1)
If Not @error Then MsgBox(0, 'Extension', $results[0])
Ce n'est pas la peine de faire un test sur les guillemets puisque le suffixe d'un fichier se base sur le point. Dans le cas précédent, il s'agit bel et bien d'un fichier "rar", et non d'un fichier "docx.rar"

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#5

Message par jguinch »

@ZDS : ce qui revient à la même chose que j'ai proposé plus haut... :-)
Le \ entre les crochets ne sert à rien, le point n'a pas besoin d'être échappé
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: [..] StringRegExp, récupération d'extension

#6

Message par mikell »

ZDS a écrit :l'extension correspond dans ton cas d'usage à "Tout ce qui n'est pas un point, entre le dernier point et le guillemet final", ce qu'on traduit en Regexp par \.([^\.]*)"$
Certes mais si tu utilises l'ancre de fin, alors plus besoin de mentionner le dernier point puisqu'il est automatiquement exclu par la classe [^.] :P

Code : Tout sélectionner

Local $results = StringRegExp('"C:\Test.test\test\fichier.docx.rar"', '([^.]+)"$', 1)
If Not @error Then MsgBox(0, 'Extension', $results[0])
jguinch, ton expression ne marche pas si pas d'extension

Code : Tout sélectionner

Local $results = StringRegExp('"c:\test.test\test\test"', '(\.[^."]+)"$|()$', 1)
If Not @error Then MsgBox(0, 'Extension', $results[0])
Il faut mettre un antislash dans la negated class : '\.([^\\."]+)"$|()$'
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#7

Message par yoyox »

Merci pour vos solution,

j'ai une question pourquoi cela ne fonctionne pas avec \Z et pourquoi mettre le guillemet avant le $
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#8

Message par mikell »

ça marche avec \Z
Le guillemet il faut le mettre parce que sinon l'expression ([^.]+)$ va retourner rar" (et l'expression ([^."]+)$ ne retournera rien)
Si ton adresse peut ne pas comporter de guillemet final, tu peux le rendre 'facultatif' mais pour que ça marche dans les 2 cas il faut l'inclure dans [^."]+ :

Code : Tout sélectionner

$pattern = '([^."]+)"?\Z'
$results1 = StringRegExp('"C:\Test.test\test\fichier.docx.rar"', $pattern, 1)
$results2 = StringRegExp('C:\Test.test\test\fichier.docx.rar', $pattern, 1)
MsgBox(0, 'Extension', $results1[0] &@crlf& $results2[0])
" 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
jl56
Niveau 7
Niveau 7
Messages : 415
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#9

Message par jl56 »

Bonjour à tous,

Je suis toujours impressionné par la puissance des expressions régulière mais comme je ne comprend pas la syntaxe sans votre aide, j’essaie de me débrouiller autrement.

Pour cette demande j'aurais codé comme ça

Code : Tout sélectionner

$chaine ='"C:\Test.test\test\fichier.docx.rar"'
if StringInStr($chaine,".") Then ; test de la présence d'un point dans la chaine si oui on découpe
$decoupe=StringSplit($chaine,".") ; découpe de la chaine entre les points
$extension=$decoupe[$decoupe[0]] ; sélection du dernier morceau
$extension=StringReplace($extension,'"',''); remplacement des " par rien
MsgBox(0, 'Extension', $extension)
EndIf
A+
JL56
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#10

Message par jguinch »

Pour comprendre la syntaxe, il faut en bouffer, pas le choix.
Regarde ce topic, mikell avait fait un truc sympa qui permet de bien commencer.
D'ailleurs mikell, ça serait bien de mettre ça dans les tutos non ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#11

Message par jchd »

mikell, un tue tôt ? Lourde accusation !

Sérieusement, il est vrai que les regex s'apparentent fortement à un langage de programmation et qu'il convient de les aborder ainsi, donc à petites bouchées, en mastiquant bien et en faisant de nombreux exer-sévices d'assouplissement. C'est certes contraignant mais il en va de même pour tout nouveau langage qui n'a pas une structure comparable à ce que l'on connait déjà.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#12

Message par yoyox »

merci encore pour votre aide

bon week end à vous
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringRegExp, récupération d'extension

#13

Message par mikell »

jchd a écrit :mikell, un tue tôt ? Lourde accusation !
Lourde mais point totalement injustifiée
Je confesse effectivement avoir commis quelques posts sur le sujet, enivré que j'étais alors avec l'émerveillement (bien excusable au demeurant) du néophyte qui s'imagine avoir enfin compris :mrgreen:
Mais ce qu'enseignent les regex au fur et à mesure qu'on progresse c'est aussi - et surtout - la modestie, et de tutos sur les regex désormais je me garderai bien
En effet il y a d'excellents sites qui le font déjà (anglophones hélas pour la plupart) et il me semble bien plus utile et préférable de se cantonner ici à des réponses/explications aussi précises que possible sur des exemples ponctuels
A petites bouchées, comme l'a fort judicieusement fait remarquer l'expert qu'est jc :wink:
" 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
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] StringRegExp, récupération d'extension

#14

Message par jchd »

Un cours (presque) complet et ciblé sur PCRE, en pur hexagonal : http://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2

Certes seules les constructions les plus basiques sont décortiquées et bien des possibilités sont tues, mais cette présentation a au moins le mérite de mettre le pied à l'étrier à qui veut bien s'y prêter. Une version soft du missionnaire avant le g*ng-b*ng, quoi.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre