filtre avec REGEX

filtre avec REGEX - VB/VBA/VBS - Programmation

Marsh Posté le 14-10-2017 à 20:50:27    

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}( )"

Reply

Marsh Posté le 14-10-2017 à 20:50:27   

Reply

Marsh Posté le 14-10-2017 à 21:00:12    

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
Reply

Marsh Posté le 14-10-2017 à 21:06:53    

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

Reply

Marsh Posté le 14-10-2017 à 21:59:30    

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
Reply

Marsh Posté le 15-10-2017 à 13:31:26    

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é!  --
Reply

Marsh Posté le 15-10-2017 à 13:40:06    

> [^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é!  --
Reply

Marsh Posté le 15-10-2017 à 19:32:43    

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
Reply

Marsh Posté le 16-10-2017 à 12:34:53    

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é!  --
Reply

Marsh Posté le 16-10-2017 à 14:17:44    

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
Reply

Marsh Posté le 16-10-2017 à 14:38:25    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed