filtre avec REGEX - VB/VBA/VBS - Programmation
Marsh Posté le 14-10-2017 à 21:00:12
daniel-12 a écrit : ou pour faire plus simple |
/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.)
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
Marsh Posté le 14-10-2017 à 21:59:30
pourquoi cela ne marche pas ?
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
Marsh Posté le 15-10-2017 à 13:31:26
Citation : -commence par ASNA, en majuscule ou minuscule |
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+,
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+,
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 :
|
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 ?
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+,
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"
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 |
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
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}( )"