Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1560 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  filtre avec REGEX

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

filtre avec REGEX

n°2306684
daniel-12
Posté le 14-10-2017 à 20:50:27  profilanswer
 

Bonsoir
je cherche a isoler dans un texte toutes les sequence de caratère constitué de la sorte :
 
-commence par ASNA, en majuscule ou minuscule
-suivi de chiffre (en général 4, mais parfois 3 ou 5, si le texte a été mal écrit)
-à suivre: du texte ou - ou autre
-à suivre : parfois des chiffres
-a la fin on considérera que c'est un espace qui délimite le mot suivant
 
ou pour faire plus simple
commence par ASNA, et on s'arrete au premier espace
 
 
exemple :
ASNA2026V3ASNA2050DXJ040ASNA2101-A07
Comment faire avec la fonction regex pour détecter à coup sûr ce genre d'écriture ?
j'en ai essayé plusieurs, mais c'est pas très concluant
filtre.Pattern = "(ASNA)[A-Z0-9]{1,10}( )"

mood
Publicité
Posté le 14-10-2017 à 20:50:27  profilanswer
 

n°2306686
rat de com​bat
attention rongeur méchant!
Posté le 14-10-2017 à 21:00:12  profilanswer
 

daniel-12 a écrit :

ou pour faire plus simple
commence par ASNA, et on s'arrete au premier espace


/ASNA[^ ]+/
(syntaxe Perl, d'après internet ça devrait être la même chose en VBS)

 

edit: Ou un peu mieux peut-être: /ASNA\d{3,5}[^ ]+/

 

(Si tu veux "capturer" ce que trouves le Regex faut rajouter des parenthèses autour du truc.)


Message édité par rat de combat le 14-10-2017 à 21:02:47
n°2306687
daniel-12
Posté le 14-10-2017 à 21:06:53  profilanswer
 

tu as fais exactement l'erreur couramment constatée:
ANSA au lieu de ASNA !
 
par contre désolé cela ne semble pas fonctionner  :??:

n°2306688
daniel-12
Posté le 14-10-2017 à 21:59:30  profilanswer
 

pourquoi cela ne marche pas ?  :cry:  
filtre.Pattern = "[^ASNA]w{1,10}( )"
 
[^ASNA] => commence pas ASNA
w => n'importe quel caratères
{1,10}=> repété 1 a 10 fois
( )=> qui fini par un espace
 
 
ci-dessous le code en totalité, utilisé dansun fichier word
 
Sub test_regex()
 
Set filtre = New regexp
'filtre.Pattern = "b[a-zA-Z]{12}b"  'filtre sur x caractères
'filtre.Pattern = "[a-zA-Z][0-9]{11} "  'filtre sur 1alpha suivi de 11num
filtre.Pattern = "[^ASNA]w{1,10}( )"
 
filtre.Global = True
 
Dim mot As Matchcollection
Set mot = filtre.Execute(ActiveDocument.Range)
 
For Each resultat In mot
Debug.Print resultat
Next resultat
 
End Sub


Message édité par daniel-12 le 14-10-2017 à 22:00:00
n°2306702
gilou
Modérateur
Modzilla
Posté le 15-10-2017 à 13:31:26  profilanswer
 

Citation :

-commence par ASNA, en majuscule ou minuscule
-suivi de chiffre (en général 4, mais parfois 3 ou 5, si le texte a été mal écrit)
-à suivre: du texte ou - ou autre
-à suivre : parfois des chiffres
-a la fin on considérera que c'est un espace qui délimite le mot suivant


En simplifiant un peu (après tes 3-5 chiffres, on prend tout ce qui n'est pas un espace/blanc/tab...) en perl ce serait ceci:
/^(ASNA\d{3,5}\S+)/i
 
 
Donc un truc de ce style devrait coller:
 
Sub test_regex()  
    Dim strPattern As String: strPattern = "^(ASNA\d{3,5}\S+)"
    Dim regEx As New RegExp
 
    With regEx
          .Global = True
           .IgnoreCase = True
           .Pattern = strPattern
     End With
 
   .........................................................
   
End Sub
 
A+,


Message édité par gilou le 15-10-2017 à 13:49:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2306703
gilou
Modérateur
Modzilla
Posté le 15-10-2017 à 13:40:06  profilanswer
 

> [^ASNA] => commence pas ASNA  
Pas du tout, c'est tout caractère sauf A S et N ça
> w => n'importe quel caratères
Non, c'est \w
> {1,10}=> repété 1 a 10 fois
OK
> ( )=> qui fini par un espace  
Non, un blanc n'est normalement pas significatif dans un regexp, pour l'espace on utilise \s
 
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2306712
daniel-12
Posté le 15-10-2017 à 19:32:43  profilanswer
 

en effet le mot de début devait être entre parenthèse,
pour le w, j'avais bien un  devant, mais le forum me l'a supprimé !
le code que tu m'a donné ne semble pas bon pour ma recherche
c'est peut être un caractère qui a disparu lors du passage sur le forum  :??:

 


j'ai quand même fais quelques test et le filtre le plus efficace semble être celui ci

 


Code :
  1. filtre.Pattern = "(ASNA|NSA|EN|NAS)d{3,5}(w{1,10})"
 

les slashs devant d et d ont encore sauté !

 

j'ai ça dans mon word
ASNA1111V3
ASNA2222-3
NAS1233-3
NSA1324-3
ASNA2854DXJ040
ASNA2356Dcj032
EN6114D9
ASNA9999DXJ010
ASNA1012-A07

 


le filtre me trouve cela
ASNA1111V3
ASNA2222
NAS1233
NSA1324
ASNA2854DXJ040
ASNA2356Dcj032
EN6114D9
ASNA9999DXJ010
ASNA1012
ça semble presque bon
le problème que j'ai c'est que le tiret me fait sortir de la recherche
comment y remédier ?


Message édité par daniel-12 le 15-10-2017 à 19:34:56
n°2306730
gilou
Modérateur
Modzilla
Posté le 16-10-2017 à 12:34:53  profilanswer
 

Je sais pas avec quoi tu colles, car chez moi les \ sont stables
Si tu remplaces \w{1,10} par (\w|-){1,10} ce que tu as devrait passer
 
Notes qu'au vu de tes données, je tenterais
filtre.Pattern = "(ASNA|NSA|EN|NAS)\d{3,5}( (\w|-){0,9}\w)"
 
et si - directement ne plait pas a ton système, essaies avec \-
 
A+,

Message cité 1 fois
Message édité par gilou le 16-10-2017 à 12:43:28

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2306732
daniel-12
Posté le 16-10-2017 à 14:17:44  profilanswer
 

mon filtre actuel:
filtre.Pattern = "(ABS|ASNA|NSA|EN|NAS)\d{1,5}-{0,1}(\w{0,10})"

 

il me détecte au moins les cas ou j'ai un tiret (ou pas)
me reste a réfléchir au cas ou on a 2 tiret, rare mais possible

 

ce qui est INVARIABLE, c'est que la fin du texte à récupérer,
est systématiquement terminé par un espace ou return ou tab

 

dommage qu'on puisse pas faire cela
"(ASNA|NSA|EN|NAS)\d{3,5} et jusqu'à a fin du mot"

  



Message édité par daniel-12 le 16-10-2017 à 14:26:58
n°2306733
daniel-12
Posté le 16-10-2017 à 14:38:25  profilanswer
 

gilou a écrit :

Je sais pas avec quoi tu colles, car chez moi les \ sont stables
Si tu remplaces \w{1,10} par (\w|-){1,10} ce que tu as devrait passer
 
Notes qu'au vu de tes données, je tenterais
filtre.Pattern = "(ASNA|NSA|EN|NAS)\d{3,5}( (\w|-){0,9}\w)"
 
et si - directement ne plait pas a ton système, essaies avec \-
 
A+,


 
 
filtre.Pattern = "(ASNA|NSA|EN|NAS)\d{1,5}( (\w|-){0,9}\w)"   Pas bon, 0 detection  
filtre.Pattern = "(ASNA|NSA|EN|NAS)\d{1,5}(\w|-){0,9}\w"  pas mal
 
la logique commence a rentrer, ca devrait aller
merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  filtre avec REGEX

 

Sujets relatifs
Sélectionner en automatique les lignes d'un résultat d'un filtreRegex Split tableau
[PHP] pourquoi ma regex ne marche pas ?[Regex] prenant en compte le caractère "à"
Sous total avec 2 filtre.filtre angular
Filtre de PowerPoint à excel fonctionne pas e mode diaporamaCakePhp faire un sommaire filtre pour personne
Macro excel - décocher toutes les cases d'un filtre sauf une[Perl] simplifier ma regex
Plus de sujets relatifs à : filtre avec REGEX


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR