Formulation correcte REGEX (like "") pour boucle

zebanx

XLDnaute Accro
Bonjour à tous,

J'ai une boucle à faire sur une colonne mais il me faut sélectionner par un "like" des cellules qui contiennent une certaine séquence :
- .... le xx ...." (x correspond à un chiffre)
ou
- string + num + string + num (texte puis chiffres puis texte puis chiffre)

J'ai regardé un peu les REGEX sur le site de JB mais c'est une découverte et "je nage" bien.

Si quelqu'un pouvait corriger SVP le code suivant sur le fichier ci-joint, merci par avance

Et si vous connaissez un bon lien /tuto sur les REGEX, je suis preneur aussi et vous en remercie par avance.

zebanx

VB:
Sub regex_02()
derligne = Cells(Rows.Count, 1).End(3).Row
For i = 1 To derligne
If Cells(i, 1) Like ("*le\s\d{2}*") Then Cells(i, 3) = Cells(i, 1)
Next i
End Sub
 

Pièces jointes

  • REGEX.xls
    32.5 KB · Affichages: 39

klin89

XLDnaute Accro
Bonsoir à tous, :)

Pour les cas présentés, ceci devrait suffire
VB:
Sub test()
Dim r As Range
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\ble \d{2} [a-z]+ \d{4}\b"
        For Each r In Range("a1", Range("a" & Rows.Count).End(xlUp))
            If .test(r.Value) Then
                r(, 3).Value = r.Value
            End If
        Next
    End With
End Sub
klin89
 

zebanx

XLDnaute Accro
Bonjour à Klin89

Merci pour ta réponse et quel plaisir de te revoir de retour sur le forum :):) .
Tu n'es pas le seul (laetitia, staples1600 et d'autres se font plus rare..) mais ça fait du bien de revoir tes grandes compétences de codeur...et de retour en plus sur un de mes posts, j'en suis très content !

Ce petit code (avec un .test jamais vu) se révèle bien pratique et couvre plus qu'une séquence "le + 2 chiffres" c'est clairvoyant !

Pourrais-tu stp me confirmer l'interprétation suivante sur le passage .Pattern = "\ble \d{2} [a-z]+ \d{4}\b"

\ble : cherche un terme qui commence par "le"
\d{2} : cherche un chiffre avec 2 caractères
[a-z]+ : cherche un string en minuscule ("+" -> avec un ou plusieurs caractères) donc pour être clair, c'est le moyen de mettre un TEXTE de n'importe quelle taille en fait ?
\d{4}\b : puis un chiffre avec 4 caractères qui est en fin de séquence.

Je constate par ailleurs dans la formule que les ESPACES ne sont pas identifiés.
Est-ce que tu te passes toujours de "\s" par exemple stp et sinon, dans quel cas l'utilises tu ?

Je te remercie par avance pour tes précisions. Pas l'occasion d'utiliser beaucoup le REGEX mais ça donne bien envie de s'y mettre.

Bonne journée et encore merci pour ta réponse (et tes futurs codes bien sûr -)
zebanx
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir Zebanx et aussi le Forum.

Cette explication est assez bien faite mais complexe, j'ai adapter le code a votre demande.

(\le) = le sans les majuscules
(\s) = Espace
(\d?\d) = entre 0 et 99 s'écrit \d?\d

Nota :
si il y a le Ou Le
reg.Pattern = "(\le|\Le)(\s)(\d?\d)"

encore si
si il y a le Ou Le Ou LE
reg.Pattern = "(\le|\Le|\LE)(\s)(\d?\d)"


VB:
Sub regex_03()

derligne = Cells(Rows.Count, 1).End(3).Row

    Dim reg As VBScript_RegExp_55.regexp
    Dim Match As VBScript_RegExp_55.Match
    Dim Matches As VBScript_RegExp_55.MatchCollection

    ' instanciation
    Set reg = New VBScript_RegExp_55.regexp

    reg.Pattern = "(\le)(\s)(\d?\d)"
For j = 1 To derligne

    Set Matches = reg.Execute(Cells(j, 1))
        For Each Match In Matches
             'MsgBox Cells(j, 1)
             Cells(j, 3) = Cells(j, 1)
'            Debug.Print "source >>", Match.Value
'                For i = 0 To Match.SubMatches.Count - 1
'                    Debug.Print "[$" & i + 1 & "]", Match.SubMatches(i)
'                Next i
        Next Match
Next j

End Sub

au plaisir de vous lire
 
Dernière édition:

zebanx

XLDnaute Accro
Bonsoir Laurent950

Très utile, je vous en remercie.
C'est vrai qu'il faut prêter plus d'attention à la casse et votre explication est très claire sur le sujet:).

J'ai retesté aussi quelque chose comme ...Pattern = "(\le\s\d{1,})" et qui a l'air de fonctionner aussi avec 1 ou plusieurs chiffres derrière "le ".
Le changement se fait sur la dernière partie (ça me parait un peu plus intuitif de l'écrire comme ça).

Je vous souhaite une bonne soirée et merci d'avoir pris le temps pour votre proposition et vos explications.

xl-ment
zebanx
 

laurent950

XLDnaute Barbatruc
Bonsoir je ferais plutôt ainsi
reg.Pattern = "([lLeE]{2})(\s)(\d?\d)"

([lLeE]{2}) = écrit avec deux caractères obligatoire soit le ou Le ou LE
(\s) = un espace qui suit
explication
vous :
\d (classe des Digit) suivie de {1,} quantificateurs préconçus {1,} soit 1 ou plusieurs répétitions
moi :
(\d?\d) = ici c'est borné entre 0 et 99 donc deux chiffres obligatoire.
\d comme vous le ? correspond si ce qui précède se répète entre 0 et 1 fois puis \d

exemple avec le ? d'exclamation pour comprendre.
(t)?utoriel
par ailleurs équivalent de (t){0,1}utoriel
correspond "tutoriel" et "utoriel"
 

Discussions similaires

Statistiques des forums

Discussions
314 085
Messages
2 105 631
Membres
109 402
dernier inscrit
dalilouille