Expressions régulières - Patterns pour RegExp

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour à tous

david84
Un petit souci ;)
Code:
Sub test()
Dim s$
s = "01/03/2011"
[A1] = s
MsgBox testDate([A1])
End Sub
Code:
Sub testII()
Dim s$
s = "01/03/2011"
[A1] = CDate(s)
[B1] = testDate([A1])
MsgBox [B1]
End Sub

PS: Il se pourrait que le petit souci ne vienne pas de testdate ;)
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re
Un petit souci
Code :
Sub test()
Dim s$
s = "01/03/2011"
[A1] = s
MsgBox testDate([A1])
End Sub
Code :
Sub testII()
Dim s$
s = "01/03/2011"
[A1] = CDate(s)
[B1] = testDate([A1])
MsgBox [B1]
End Sub

PS: Il se pourrait que le petit souci ne vienne pas de testdate

Si, c'est le CDate qui provoque cela à la fin du code.
Je l'ai enlevé et cela fonctionne correctement.
De toutes les façons, autant l'enlever puisque d'une part nous traitons une chaîne de caractères et non une date, et d'autre part puisque normalement un motif au point ne doit pas laisser passer une date non valide.

Donc le code devient :
Code:
Function testDate(Cellule As Range) As String
'Application.Volatile
Dim oRexp, Match, Matches, MaDate As Date, MesMois, MesMoisBis, I As Integer, MaChaine As String, Jour As Long, An As Long
If Cellule = "" Then Exit Function
MesMois = Array("janvier", "janv.", "janv", "février", "févr.", "févr", "mars", "avril", "avr.", " avr ", "mai", "juin", _
    "juillet", "juil.", "juil", "août", "septembre", "sept.", "sept", "octobre", "oct.", "oct", "novembre", "nov.", "nov", "décembre", "déc.", "déc")
    
MesMoisBis = Array("/01/", "/01/", "/01/", "/02/", "/02/", "/02/", "/03/", "/04/", "/04/", "/04/", "/05/", "/06/", "/07/", "/07/", "/07/", _
    "/08/", "/09/", "/09/", "/09/", "/10/", "/10/", "/10/", "/11/", "/11/", "/11/", "/12/", "/12/", "/12/")
MaChaine = Cellule.Value

For I = LBound(MesMois) To UBound(MesMois)
    If InStr(1, Cellule.Value, MesMois(I), vbTextCompare) > 0 Then
        MaChaine = Trim(Replace(MaChaine, MesMois(I), MesMoisBis(I)))
        MaChaine = Replace(Replace(MaChaine, " /", "/"), "/ ", "/")
        Exit For
    End If
Next I

Set oRexp = CreateObject("vbscript.regexp")
With oRexp
    .Global = True
    .Pattern = "(\b\d{1})(/\d{2}/\d{4})"
    'Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, "0$1$2")
    .Pattern = "(\b\s)(\d{1})(/\d{2}/)((?:0|1|2)[0-9])"
    'Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, "0$2$320$4")
    .Pattern = "(\b\s)(\d{1})(/\d{2}/)((?:3|4|5|6|7|8|9)[0-9])"
    'Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, "$10$2$319$4")
    .Pattern = "((0[1-9]|[12]\d|3[01])/(0[13578]|1[02])|(0[1-9]|[12]\d|30)/(0[469]|11))/(190[1-9]|19[1-9]\d|(20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)|29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])"
    'Set Matches = .Execute(MaChaine)
    If .test(MaChaine) = True Then testDate = Right(MaChaine, 10) Else testDate = "Date non valide"
End With
End Function

A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonsoir à tous

David84
Juste pour le fun (et par curiosité), comment faire pour savoir quelle ligne est la plus gourmande ?
If .Test(MaChaine) Then testDate = Right(MaChaine, 10) Else testDate = "Date non valide"
testDate = Switch(.Test(MaChaine), Right(MaChaine, 10), Not .Test(MaChaine), "Date non valide")
testDate = IIf(.Test(MaChaine), Right(MaChaine, 10), "Date non valide")
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonsoir,
ci-joint la fonction retravaillée de manière à ramener une ou plusieurs dates valides.
L'idée à développer : ramener ces dates qu'elles que soient leur format initial dans le texte (je parle toujours de chaîne de caractères et non de dates formatées) au format chaîne de caractères jj/mm/aaaa.

Pour cela, code en 3 étapes :
1) traitement du mois pour le ramener sous forme de /xx/ (comme Jean-Noël l'avait traité dans le fichier indiqué dans les messages antérieurs)
2) traitement du jour
3) traitement de l'année

J'ai fait en sorte que les motifs jour et année soit structurées de la même manière afin de travailler plus facilement sur les sous-motifs à modifier.

J'ai laissé les différents Execute actifs pour permettre de tester la collection ramenée par chaque motif.

Code:
Function testDate2(Cellule As Range, Rang As Integer) As String
'Application.Volatile
Dim oRexp, Match, Matches, MaDate As Date, MesMois, MesMoisBis, I As Integer, MaChaine As String, Jour As Long, An As Long
If Cellule = "" Then Exit Function
MesMois = Array("janvier", "janv.", "janv", "février", "févr.", "févr", "mars", "avril", "avr.", " avr ", "mai", "juin", _
    "juillet", "juil.", "juil", "août", "septembre", "sept.", "sept", "octobre", "oct.", "oct", "novembre", "nov.", "nov", "décembre", "déc.", "déc")
    
MesMoisBis = Array("/01/", "/01/", "/01/", "/02/", "/02/", "/02/", "/03/", "/04/", "/04/", "/04/", "/05/", "/06/", "/07/", "/07/", "/07/", _
    "/08/", "/09/", "/09/", "/09/", "/10/", "/10/", "/10/", "/11/", "/11/", "/11/", "/12/", "/12/", "/12/")
MaChaine = Cellule.Value

For I = LBound(MesMois) To UBound(MesMois) 'traitement du mois
    If InStr(1, Cellule.Value, MesMois(I), vbTextCompare) > 0 Then
        MaChaine = Trim(Replace(MaChaine, MesMois(I), MesMoisBis(I)))
        MaChaine = Replace(Replace(MaChaine, " /", "/"), "/ ", "/")
    End If
Next I

Set oRexp = CreateObject("vbscript.regexp")
With oRexp
    .Global = True
    'traitement du jour
    .Pattern = "(?:\s|\b)(\d{1})(/\d{2}/)(\d{2,4})(?:\s|\b)"
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " 0$1$2$3 ")
    
    'traitement de l'année
    .Pattern = "(?:\s|\b)(\d{1,2})(/\d{2}/)((?:0|1|2){1}[0-9])(?:\s|\b)" 'années 2000 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$220$3 ")
       
    .Pattern = "(?:\s|\b)(\d{1,2})(/\d{2}/)((?:3|4|5|6|7|8|9){1}[0-9])(?:\s|\b)" 'années 1900 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$219$3 ")
    
    .Pattern = "((0[1-9]|[12]\d|3[01])/(0[13578]|1[02])|(0[1-9]|[12]\d|30)/(0[469]|11))/((16|17|18|19|20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/((16|17|18|19|20|21)\d\d)|29/02/((190|210)[48]|(16|17|18|19|20|21)([13579][26]|[2468][048])|200[048])"
    If .test(MaChaine) = True Then
        Set Matches = .Execute(MaChaine)
        If Rang - 1 < Matches.Count Then testDate2 = Matches(Rang - 1) Else testDate2 = ""
    Else
        If Rang = 1 Then testDate2 = "Date non valide" Else testDate2 = ""
    End If
End With
End Function

Tout n'est bien sûr pas au point mais c'est la manière la plus "propre" que je vois si l'on veut limiter le nombre de motifs à traiter tout en y retrouvant ses petits.

Cela vous convient-il ou avez-vous une autre idée pour traiter cela ?
Si l'on veut avancer, ils nous faut d'abord déterminer notre angle d'attaque du problème.
Qu'en pensez-vous ?

Juste pour le fun (et par curiosité), comment faire pour savoir quelle ligne est la plus gourmande ?
If .Test(MaChaine) Then testDate = Right(MaChaine, 10) Else testDate = "Date non valide"
testDate = Switch(.Test(MaChaine), Right(MaChaine, 10), Not .Test(MaChaine), "Date non valide")
testDate = IIf(.Test(MaChaine), Right(MaChaine, 10), "Date non valide")

Je pense que nous pourrons le savoir lorsque le reste sera calé et que nous pourrons traiter un nombre de données important.

A+
 

Pièces jointes

  • Test_date_format.xls
    60.5 KB · Affichages: 53
  • Test_date_format.xls
    60.5 KB · Affichages: 50
  • Test_date_format.xls
    60.5 KB · Affichages: 51

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonne nuit à tous

David84
Beau boulot

Si j'ai bien compris les données du problème.
Voila ce que cela m'évoque à cette heure avancée (d'ailleurs je me déconnectes après ce message)
Il faudrait qu'on essaie de lister un maximum de strings possibles, non ?
Est-ce possible d'estimer ce nombre ?
Déja combien de permutations possibles dans un string de ce genre?
abcJJ/MM/YY123
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re JM

Il faudrait qu'on essaie de lister un maximum de strings possibles, non ?
on pourrait traiter les string de type francophone (jour mois année) dont les formats de chaîne de caractères sont utilisées dans Excel
Déja combien de permutations possibles dans un string de ce genre?
abcJJ/MM/YY123
pas tant que cela je pense car déjà le jour (abc) n'est pas pris en compte dans le traitement.
Si tu as une chaîne de type "...mardi 29 février 1600...", le code actuel te dira que le 29 février 1600 est une date valide, mais pas si c'était un mardi.

Ceci dit, je pense que l'on pourrait sûrement trouver un algorithme à placer en sortie du motif final qui nous ferait ce traitement puisque l'on sait que le 1er janvier 1600 était un samedi (à voir peut-être pour plus tard).

Est-ce possible d'estimer ce nombre ?
Si l'on s'en tient aux formats utilisés dans Excel, le problème principale me semble être le traitement de la partie mois (janvier, janv., janv-, 01,1,...).
Une fois cette partie réglée, les jours et les années étant des strings écrits en chiffres, cela reste dans les limites du raisonnable (je ne te parle pas de traiter des dates écrites du type "le premier janvier mil neuf cent quatre-vingts-dix-neuf" où là il faudrait passer par un traitement préalable des jours, millénaire, centenaire, décennie et année comme cela est fait pour les mois).

Sinon, petit correctif sur le motif que ne prenait pas en compte l'année 1600 comme bissextile (plus quelques allègements du code ici où là) :

Code:
Function testDate2(Cellule As Range, Rang As Integer) As String
'Application.Volatile
Dim oRexp, Match, Matches, MesMois, MesMoisBis, I As Integer, MaChaine As String, Jour As Long, An As Long
If Cellule = "" Then Exit Function
MesMois = Array("janvier", "janv.", "janv", "février", "févr.", "févr", "mars", "avril", "avr.", "avr", "mai", "juin", _
    "juillet", "juil.", "juil", "août", "septembre", "sept.", "sept", "octobre", "oct.", "oct", "novembre", "nov.", "nov", "décembre", "déc.", "déc")
    
MesMoisBis = Array("/01/", "/01/", "/01/", "/02/", "/02/", "/02/", "/03/", "/04/", "/04/", "/04/", "/05/", "/06/", "/07/", "/07/", "/07/", _
    "/08/", "/09/", "/09/", "/09/", "/10/", "/10/", "/10/", "/11/", "/11/", "/11/", "/12/", "/12/", "/12/")
MaChaine = Cellule.Value

For I = LBound(MesMois) To UBound(MesMois) 'traitement du mois
    If InStr(1, Cellule.Value, MesMois(I), vbTextCompare) > 0 Then
        MaChaine = Trim(Replace(MaChaine, MesMois(I), MesMoisBis(I)))
        MaChaine = Replace(Replace(MaChaine, " /", "/"), "/ ", "/")
    End If
Next I

Set oRexp = CreateObject("vbscript.regexp")
With oRexp
    .Global = True
    'traitement du jour
    .Pattern = "(?:\s|\b)(\d{1})(/\d{2}/)(\d{2,4})(?:\s|\b)"
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " 0$1$2$3 ")
    
    'traitement de l'année
    .Pattern = "(?:\s|\b)(\d{1,2})(/\d{2}/)((?:0|1|2){1}[0-9])(?:\s|\b)" 'années 2000 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$220$3 ")
       
    .Pattern = "(?:\s|\b)(\d{1,2})(/\d{2}/)((?:3|4|5|6|7|8|9){1}[0-9])(?:\s|\b)" 'années 1900 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$219$3 ")
    'le motif traite les dates des années 1600 à 2199
    .Pattern = "((0[1-9]|[12]\d|3[01])/(0[13578]|1[02])|(0[1-9]|[12]\d|30)/(0[469]|11))/((16|17|18|19|20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/((16|17|18|19|20|21)\d\d)|29/02/((17|18|19|21[0])[48]|(17|18|19|20|21)([13579][26]|[2468][048])|(160|200)[048])"
    If .test(MaChaine) = True Then
        Set Matches = .Execute(MaChaine)
        If Rang - 1 < Matches.Count Then testDate2 = Matches(Rang - 1)
    Else
        If Rang = 1 Then testDate2 = "Date non valide"
    End If
End With
End Function
Sinon, as-tu une autre idée de la manière de traiter le cas des dates ?
A+
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour,

Ci-joint une version un peu améliorée :
- motif retouché afin de prendre en compte différents séparateurs et les mois à 1 chiffre (1 au lieu de 01)
- prise en compte des mois en majuscule ou minuscule, avec ou sans accent (correspondance effectuée dans l'array mais on peut inclure une fonction sans accent si l'on préfère)
- utilisation de format pour ramener la date au format jj/mm/aaaa quel que soit la chaîne de caractère initiale).
Tous les formats de chaînes de caractère de type date ne sont pas traités pour l'instant.

Merci de tester de votre côté (le fichier est là pour cela:rolleyes:) et de m'indiquer celles à traiter, les bug,...

Code:
Function testDate(Cellule As Range, Rang As Integer) As String
'Application.Volatile
Dim oRexp, Match, Matches, MesMois, MesMoisBis, I As Integer, MaChaine As String, Jour As Long, An As Long
If Cellule = "" Then Exit Function

MesMois = Array("janvier", "janv.", "janv", "février", "févr.", "févr", "fevrier", "fevr.", "fevr", _
"mars", "avril", "avr.", " avr ", "mai", "juin", _
"juillet", "juil.", "juil", "août", "aout", "septembre", "sept.", _
"sept", "octobre", "oct.", "oct", "novembre", "nov.", "nov", "décembre", "déc.", "déc", "decembre", "dec.", "dec")
    
MesMoisBis = Array("/01/", "/01/", "/01/", "/02/", "/02/", "/02/", "/02/", "/02/", "/02/", _
"/03/", "/04/", "/04/", "/04/", "/05/", _
"/06/", "/07/", "/07/", "/07/", "/08/", "/08/", "/09/", "/09/", _
"/09/", "/10/", "/10/", "/10/", "/11/", "/11/", "/11/", "/12/", "/12/", "/12/", "/12/", "/12/", "/12/")
MaChaine = LCase(Cellule.Value)

For I = LBound(MesMois) To UBound(MesMois) 'traitement du mois
    If InStr(1, Cellule.Value, MesMois(I), vbTextCompare) > 0 Then
        MaChaine = Trim(Replace(MaChaine, MesMois(I), MesMoisBis(I)))
        MaChaine = Replace(Replace(MaChaine, " /", "/"), "/ ", "/")
    End If
Next I

Set oRexp = CreateObject("vbscript.regexp")
With oRexp
    .Global = True
    .IgnoreCase = True
    
    'traitement du jour
    .Pattern = "(?:\s|\b)(\d{1})([ /-]\d{1,2}[ /-])(\d{2,4})(?:\s|\b)"
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " 0$1$2$3 ")
    
    'traitement de l'année
    .Pattern = "(?:\s|\b)(\d{1,2})([ /-]\d{1,2}[ /-])((?:0|1|2){1}[0-9])(?:\s|\b)" 'années 2000 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$220$3 ")
       
    .Pattern = "(?:\s|\b)(\d{1,2})([ /-]\d{1,2}[ /-])((?:3|4|5|6|7|8|9){1}[0-9])(?:\s|\b)" 'années 1900 à 2 chiffres
    Set Matches = .Execute(MaChaine)
    MaChaine = .Replace(MaChaine, " $1$219$3 ")
    .Pattern = "((0[1-9]|[12]\d|3[01])[ /-](0?[13578]|1[02])|(0[1-9]|[12]\d|30)[ /-](0?[469]|11))[ /-]((16|17|18|19|20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])[ /-]0?2[ /-]((16|17|18|19|20|21)\d\d)|29[ /-]0?2[ /-]((190|210)[48]|(17|18|19|20|21)([13579][26]|[2468][048])|(160|200)[048])"
    If .test(MaChaine) = True Then
        Set Matches = .Execute(MaChaine)
        If Rang - 1 < Matches.Count Then testDate = Format(Matches(Rang - 1), "dd/mm/yyyy")
    Else
        If Rang = 1 Then testDate = "Date non valide"
    End If
End With
End Function
A+

Edit : fichier modifié
 

Pièces jointes

  • Test_date_format_12_01.xls
    70.5 KB · Affichages: 54
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonsoir à tous


David84 & JNP ;) (et si d'autres amateurs de patterns passent dans ce fil ;) )
Je me suis trituré les méninges, j'ai lu tes explications, relu beaucoup de mes archives regexpienens, mais là j'ai les synapses qui flanchent ;)
Un tit coup de main svp pour mixer les patterns ce fil , svp.
VB:
Function ADADATE(ByVal s$) As Variant
Const MOIS As String = _
"(janv(ier)?|févr(ier)?|mar(s)?|avr(il)?|mai?|juin?|juil(let)?|août?|sept(embre)?|oct(obre)?|nov(embre)?|déc(embre)?)"
Dim Matches
With CreateObject("VBScript.RegExp")
    .Global = -1: .IgnoreCase = -1
     .Pattern = "^((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((MOIS)\d{1,2}(,?\s*\d{4})?)|(\d{1,2}[- ]*(" & MOIS & ")([- ]*\d{2,4})?)\b"
Set Matches = .Execute(s)
End With
ADADATE = vbNullString
If Matches.Count > 0 Then ADADATE = CDate(Matches.Item(0).Value)
End Function
VB:
Sub aTest()
Dim tDates, i As Byte, test$, a$, b$
With Application
Randomize 2012111
    .ScreenUpdating = False
        For i = 0 To 11
        a = i + 1 & ". " & .Rept(Chr(65 + Int((Rnd * 26) + 1)), Int((Rnd * 5) + 1)) & Format(Date + (i * Int((Rnd * 240) + 1)), IIf(i Mod 2 = 0, "dddd d mmm yyyy", "d mmmm yy")) & .Rept(Chr(65 + Int((Rnd * 26) + 1)), Int((Rnd * 6) + 1))
        b = b & a & vbCrLf
        test = test & i + 1 & ". " & ADADATE(a) & vbCrLf
        Next i
End With
MsgBox b, vbInformation, "STRINGS": MsgBox test, vbExclamation, "DATES"
End Sub
 

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re JM:)
comme ça sans explication c'est compliqué de t'éclairer. Il faudrait que tu nous commente plus ton motif.
Une question : seuls les mois de 31 jours semblent traités dans le motif :
- me trompe-je ?
- si oui pourquoi ?
Une constatation : tu ne peux ramener l'année puisqu'aucun de tes subitems ne la saisit.
C'est peut-être la raison de ton problème et pourquoi il te ramène uniquement l'année actuelle.
Mais là, avec aussi peu d'explications je navigue à vue...
Au plaisir de te relire avec plus d'infos:rolleyes:.
A+
 

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re


Justement je suis en manque d'explications, car j'ai fait ce code à la hussarde, en mixant plusieurs bout de pattern donc certains des tiens.

En fait j'ai voulu essayé de "simplifier" cette parti de de ton code:

MesMois = Array("janvier", "janv.", "janv", "février", "févr.", "févr", "fevrier", "fevr.", "fevr", _
"mars", "avril", "avr.", " avr ", "mai", "juin", _
"juillet", "juil.", "juil", "août", "aout", "septembre", "sept.", _
"sept", "octobre", "oct.", "oct", "novembre", "nov.", "nov", "décembre", "déc.", "déc", "decembre", "dec.", "dec")

en

Const MOIS As String = _
"(janv(ier)?|févr(ier)?|mar(s)?|avr(il)?|mai?|juin?|juil(let)?|août?|sept(embre)?|oct(obre)?|nov(embre)?|déc(embre)?)"

Ensuite, j'ai ajouté des "morceaux de patterns" et tester avec aTest pour voir si le code ne générait pas d'erreur
(ce qui semble être le cas au niveau des erreurs)
mais l'étape suivante c'est pouvoir trouver un pattern optimisé en y intégrant cette partie du tien ;)(cf ci-dessous)

Code:
"(0[1-9]|[12]\d|30)[  /-](0?[469]|11))[ /-]((16|17|18|19|20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])[  /-]0?2[ /-]((16|17|18|19|20|21)\d\d)|29[ /-]0?2[  /-]((190|210)[48]|(17|18|19|20|21)([13579][26]|[2468][048])|(160|200)[048])"[COLOR=#800000]
[/COLOR]
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re
il se fait tard et je vais bientôt aller me coucher.
Commence par tester avec ce motif simplifié qui te ramène déjà une partie des résultats :
.Pattern = "(0[1-9]|[12]\d|3[01])[ /](" & MOIS & ")[ /](\d{2,4})"
Pour le reste, procède par nouveau motif pour ramener les autres types recherchés. Tu pourras ensuite les mettre bout à bout.
Après seulement tu pourras chercher si besoin à abstraire encore plus.
A+
 

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re


Bonne nuit à toi David ;)
(Merci tu m'as refortifier le cortex avec ton dernier pattern ;))

Sub aTestII()
Dim tDates, i As Byte, test$, a$
With Application: Randomize 2012111
.ScreenUpdating = False
For i = 0 To 11
a = _
i + 1 & ".Xz" & Format(Date + (i * Int((Rnd * 120) + 1)), _
IIf(i Mod 2 = 1, "dddd d mmm yyyy", "d mmmm yyyy")) & _
"+²" & Int(Rnd * 9)
Cells(i + 1, 1) = a: Cells(i + 1, 2) = ADADATE(a)
Next i
End With
End Sub


VB:
Function ADADATE(ByVal s$) As Variant
Const MOIS As String = _
"(janv(ier)?|févr(ier)?|mar(s)?|avr(il)?|mai?|juin ?|juil(let)?|août?|sept(embre)?|oct(obre)?|nov(embre)?|déc(embre)?)"
Dim Matches
With CreateObject("VBScript.RegExp")
.Global = -1: .IgnoreCase = -1
.Pattern = "(0?[1-9]|[12]\d|3[01])[ /](" & MOIS & ")[ /](\d{2,4})"
Set Matches = .Execute(s)
End With
ADADATE = vbNullString
If Matches.Count > 0 Then ADADATE = CDate(Matches.Item(0).Value)
End Function
[FONT=monospace][/FONT]





 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Re JM
2 points à te signaler après quelques tests :

- enlever l'espace de
pour que le motif puisse trouver les dates de ce mois, donc :
Code:
Const MOIS As String = _
"(janv(ier)?|févr(ier)?|mar(s)?|avr(il)?|mai?|juin ?|juil(let)?|août?|sept(embre)?|oct(obre)?|nov(embre)?|déc(embre)?)"
(à moins que ce ne soit l'effet de la recopie dans la balise
)

- modification dans le motif afin que les dates entrées avec un seul digit en jour (9.Xz9 juillet 2013+²4) soient prises en compte par le motif :
Code:
.Pattern = "(0?[1-9]|[12]\d|3[01])[ /](" & MOIS & ")[ /](\d{2,4})"

J'ai enlevé le \w car il ne sert pas dans ton exemple actuel.
A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Expressions régulières - Patterns pour RegExp

Bonjour à tous

David84 ;)
Merci pour tes corrections

Maintenant, comment faire pour ajouter ton pattern?
Code:
'le motif traite les dates des années 1600 à 2199
    .Pattern =  "((0[1-9]|[12]\d|3[01])/(0[13578]|1[02])|(0[1-9]|[12]\d|30)/(0[469]|11))/((16|17|18|19|20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/((16|17|18|19|20|21)\d\d)|29/02/((17|18|19|21[0])[48]|(17|18|19|20|21)([13579][26]|[2468][048])|(160|200)[048])"
 

Statistiques des forums

Discussions
315 094
Messages
2 116 144
Membres
112 669
dernier inscrit
Guigui2502