Expressions régulières

Salut le fil

Les expressions régulières... c'est pas mon fort et là j'ai besoin d'un coup de main

La requêtte n'est pas très compliquée en sois mais je tourne en boucle donc voilà

  • Recherche d'une date.
  • Parenthèses OU Crochets optionnels
  • Fin de phrase ou pas.

Ce pattern fait son boulot à 90%

"([\[\(])?([0-9]{4})([\)\]])?"

Là ou je plante c'est la recherche en fin de phrase, si la date est toute seule ceci la trouve

"([\[\(])?([0-9]{4})([\)\]])?$"

Mais dès qu'elle est entre parenthèses ou crochets là c'est nada.

Je suis donc à la recherche d'une solution avec un pro de ce type d'expressions.

Merci d'avance à tous ceux qui voudront bien se pencher sur ce problème.

Bonjour Jean-Paul,

Peux-tu nous donner des exemples de données que la regex doit valider ou non ?

Et c'est pour l'utiliser avec quoi ? Excel ? Google Sheets ? Autre ?

Salut Sébastien

Merci d'abord de te pencher sur ce problème.

C'est pour ma Médiathèque . Je m'amuse, plein de logiciels font ça très bien...

Voici quelques exemples

sans option fin de texte coché:

Celle là ne me pose aucuns problèmes...

2001 l’odyssée de l'espace (1999)

Nos belles années 2000 dans ce camping

2001 l'odyssée de l'espace1999

Bienvenue à Gataca [2015]

Avec option fin de texte cochée :

Mais là .....

2001 l’odyssée de l'espace (1999)

Nos belles années 2000 dans ce camping

2001 l'odyssée de l'espace1999

Bienvenue à Gataca [2015]

Tout est dans le visuel...

Donc il faut deux patterns ou un qui s'ajoute au premier

plein de logiciels font ça très bien...

En fait les regex et fonctions qui vont avec varient selon la solution utilisée ...

Je vais tester avec Google Sheets et la fonction REGEXEXTRACT (tu as aussi les fonctions REGEX... dans le pack de fonctions pour Excel au cas où).

Avec option fin de texte cochée :

Mais là .....

2001 l’odyssée de l'espace (1999)

Nos belles années 2000 dans ce camping

2001 l'odyssée de l'espace1999

Bienvenue à Gataca [2015]

Est-ce que c'est le résultat attendu ?

=SIERREUR(REGEXEXTRACT(A1;"[\[(]?\d{4}[\])]?$");"")
regex

Bon là j'ai un problème si je vais sur un

il ne trouve que [2015] avec le $ en fin de chaine. Si je l'enlève il trouve tout.

Je vais donc faire un test directement en VBA avec VBScript_RegExp_55, je ferais une boucle sur les valeurs trouvées mais pas ce soir. Demain debout de bonne heure.

Quand même merci

Bon là j'ai un problème si je vais sur un

il ne trouve que [2015] avec le $ en fin de chaine. Si je l'enlève il trouve tout.

Tu peux utiliser ma regex [\[(]?\d{4}[\])]?$ mais tu dois cocher "multi line" (pour que le $ s'applique à chaque fin de ligne)

regex 2

Merci, c'est nikel

Comme quoi il vaut mieux un qui sait que dix qui cherchent...

Je vais pouvoir dormir tranquille,

Heu si je trouve pas je risque de revenir pour d'autres expressions, mais d'abord je cherche..

Salut le fil

Bon je suis encore là et toujours avec ce problème.

Pour pouvoir faire mes replace comme je veux je voudrais pouvoir découper le titre de cette façon:

exemple de titre:

2001 l’odyssée de l'espace (1969)

le pattern : "(.*)([\[(]?)(\d{4})([\])])?$" me renvoie :

2001 l’odyssée de l'espace ( pour le premier groupe

Je n'arrive pas à lui faire prendre le début de titre sans les ( ou [

Le premier groupe doit prendre le début de titre (.*)

Le deuxième groupe doit prendre ( OU [ avec ou sans espace après ([\[( ?])

Le troisième groupe doit prendre la date (\d{4})

Le quatrième groupe doit prendre ) OU ] avec ou sans espace avant ( ?[\])])

Mais quand je mets tout cela bout à bout ça ne fonctionne pas.

Je veux sur un titre pouvoir mettre ou pas la date, entre parenthèses ou pas.

Une idée ?

Coche Ungreedy dans la liste

Coche Ungreedy dans la liste

Salut Sébastien,

Ca je l'ai vu et appliqué, cela marche sur le testeur, mais après sous VBA c'est une autre histoire, j'ai regardé si l'équivalent existait mais je n'ai pas trouvé.

Une autre piste :

([^\[(]*)([\[(])?(\d{4})([\])])?$

Une autre piste :

([^\[(]*)([\[(])?(\d{4})([\])])?$

Salut Sébastien,

Je suis au boulot , je teste ce soir mais à mon avis cela ne va pas me renvoyer le début de chaine avec ([^\[(]*) mais vu mon ignorance sur le sujet je vais tester, merci quand même de te pencher dessus.

Moi j'ai tester (.*[^\[(])....... mais ça ne fonctionne pas

Salut le fil

Bon voilà je suis arrivé à ce résultat c'est pas du 100% donc je vais voir pour affiner.

'————————   GENERALITES   ———————————————————————————————————————————————
    '   Pour éviter un appel récursif à la fonction GetParam du fait que je traite tous les titres d'un répertoire, pCleanFlag est chargé au changement de page d'un ControlTab il contient les options de Formats
    '   pCleanflag est chargé dans la Sub LoadFlagValue
    '   pCleanFlag est déclarer en enumération «vaOptions»

  With reg  'Dim reg As New VBScript_RegExp_55.RegExp
      .Global = True
        .IgnoreCase = True

   'On formate la date de sortie si elle existe et selon le choix de format
        'Seules les dates en fin de titre sont prises en compte
        .Pattern = "([\[\(])?( ?)(\d{4})( ?)([\]\)])?$"
        If pCleanFlag And SansDate Then
            If .test(strFileName) = True Then
                strTemp = .Replace(strFileName, "")
                If strTemp <> vbNullString Then strFileName = strTemp 'Si le titre ne contient que la date ex: 2012
            End If

        ElseIf pCleanFlag And AvecParenteses Then
            If .test(strFileName) = True Then
                strTemp = .Replace(strFileName, "($3)")
                strFileName = strTemp
            End If

        ElseIf pCleanFlag And SansParentheses Then
            If .test(strFileName) = True Then
                strTemp = .Replace(strFileName, "$3")
                strFileName = strTemp
            End If
        End If

    End With 
    

Pas mieux pour l'instant, il me reste à gérer les espaces devant la date....

bonsoir

j'arrive un peu tard mais si j'ai bien compris on recherche uniquement les années a la fin parenthèses et/ou accolades ou pas

ben le "OR" existe avec le regex "|"

=regexo($A2;"((\d{4})|[^\w]+(\d{4})[^\w])$")

la fonction

Function reGeXo(cel As String, motif)
  Dim matchs
      reGeXo = "nofund!"
      With CreateObject("VBScript.RegExp"):
        .Global = True: .IgnoreCase = True: .Pattern = motif
         Set matchs = .Execute(cel)
         If matchs.Count > 0 Then
          reGeXo = matchs(0)
        End If
    End With
End Function
capture

Bonjour à tous,

J'arrive moi aussi un peu tard avec une proposition en 2 temps pour extraire l'année :

Function ExtractAnnee$(chaine$)

Dim regexp as object
set regexp = createobject("vbscript.regexp")

With regexp
    .global = true
    .Pattern = ".?\d{4}.?$" '4 chiffres possiblement précédés et suivis d'un caractère quelconque en fin de chaine
    if .test(chaine) then
        ExtractAnnee = .execute(chaine)(0).value 'retourne la correspondance si existe
        .Pattern = "\D" 'tout sauf chiffres (à appliquer au résultat cette fois)
        if .test(ExtractAnnee) then ExtractAnnee = .replace(ExtractAnnee, "") 'si existe dans ExtractAnnee, pattern remplacé par vide
    end if
end with

End Function

Function ExtractTitre$(chaine$)

Dim regexp as object
set regexp = createobject("vbscript.regexp")

With regexp
    .Pattern = ".?\d{4}.?$" 'idem
    'si existe, on remplace par vide puis on efface l'espace résiduel de fin, sinon, on renvoie la chaine
    if .test(chaine) then ExtractTitre = trim(.replace(chaine, "")) else ExtractTitre = chaine
end with

End Function

De cette manière, on allège les pattern...

Cdlt,

Salut le fil,

Déjà merci pour votre implication ça fait toujours plaisir...

Ce qu'il faut savoir c'est que je travaille en VBA et sous Access ce qui à mon sens ne doit pas poser de problèmes.

3GB ton pattern : ".?\d{4}.?$" ne peut pas fonctionner comme dit plus haut j'ai besoin de faire trois groupe de capture pour pouvoir mettre ou enlever les parenthèses sur les dates.

Patrick, j'ai testé ton Pattern : "((\d{4})|[^\w]+(\d{4})[^\w])$" Alors bizarrement si cela fonctionne sur une feuille Excel cela donne des résultats inattendus en VBA comme vous allez pouvoir le voir sur les captures d'écrans. J'utilise ce code sur la Reg Expression

'// On formate la date de sortie si elle existe et selon le choix de format
        '// Seules les dates en fin de titre sont prises en compte
        '.Pattern = "([\[\(])?( ?)(\d{4})( ?)([\]\)])?$"
        '// Test de patern donné sur excel pratique
        .Pattern = "((\d{4})|[^\w]+(\d{4})[^\w])$"

        '// Si on trouve une date...
        If .test(strFileName) = True Then

            Set Matches = .Execute(strFileName)
            '//Si le titre ne comporte que la date on ignore
            strTemp = .Replace(strFileName, "")
            If strTemp <> "" Then

                strTemp = ""
                If pCleanFlag And SansDate Then
                    strTemp = .Replace(strFileName, "")
                    If strTemp <> vbNullString Then strFileName = strTemp    'Si le titre ne contient que la date ex: 2012
                ElseIf pCleanFlag And AvecParenteses Then
                    strTemp = .Replace(strFileName, " ($3)")
                    strFileName = strTemp
                ElseIf pCleanFlag And SansParentheses Then
                    strTemp = .Replace(strFileName, " $3")
                    strFileName = strTemp

                End If
            End If
        End If

Donc on commence avec un format sans date :

Tu remarqueras que les résultats sont inattendus...

sans date

Maintenant un format avec date sans parenthèses :

date sans

Et pour finir un format avec date et parenthèses :

Pourquoi il supprime 1969 entre autre

date avec

Voilà mon Pattern fonctionne pas mal et je pense que je vais le garder pour l'instant, bien entendu je dois encore peaufiner mon code et c'est pas gagné.

Ci dessous les captures d'écrans, sans dates, avec dates et parenthèses, avec date sans parenthèses.

Encore merci à tous je vais noté ce sujet résolu, mais cela n’empêche pas quelqu’un de venir proposer un meilleur Pattern

sans date mon pattern date avec mon pattern date sans mon pattern

Bonjour Jean-Paul,

Je ne l'ai pas testé mais s'il faut prendre la fin d'une chaine lorsqu'elle se compose uniquement de 4 chiffres ou de 4 chiffres entourés de parenthèses ou de crochets, alors ça devrait fonctionner.

En fait, on a un premier pattern de test d'existence que je mets d'ailleurs à jour :

Function ExtractAnnee$(chaine$)

Dim regexp as object
set regexp = createobject("vbscript.regexp")

With regexp
    .global = true
    .Pattern = "\D?\d{4}\D?$" '4 chiffres possiblement précédés et suivis d'un caractère non numérique, le tout en fin de chaine
    if .test(chaine) then
        ExtractAnnee = .execute(chaine)(0).value 'retourne la correspondance si existe
        .Pattern = "\D" 'tout sauf chiffres (à appliquer au résultat cette fois)
        if .test(ExtractAnnee) then ExtractAnnee = .replace(ExtractAnnee, "") 'si existe dans ExtractAnnee, pattern remplacé par vide
    end if
end with

End Function

Si il y a correspondance, on remplace tous les caractères n'étant pas des chiffres sur cette correspondance. On agit ainsi en 2 temps avec des patterns simplifiés.

Une autre méthode serait de faire :

Function ExtractAnnee$(chaine$)

Dim regexp as object
set regexp = createobject("vbscript.regexp")

With regexp
    .global = true
    .Pattern = "\D?\d{4}\D?$" '4 chiffres possiblement précédés et suivis d'un caractère non numérique, le tout en fin de chaine
    if .test(chaine) then
        ExtractAnnee = .execute(chaine)(0).value 'retourne la correspondance si existe
        .Pattern = "\d{4}" '4 chiffres (à appliquer au résultat cette fois)
        ExtractAnnee = .execute(ExtractAnnee)(0).value 'extraction des 4 chiffres
    end if
end with

End Function

A tester quand même, sait-on jamais .

Cdlt,

re

bonsoir a tous

a mon avis vous avez le boxon dans vos librairie windows (remarque si W10 avec VBS je serais pas étonné)

en tout cas chez moi que ce soit en formule excel ou vba et j'ai même testé en JS et ça fonctionne j'ai bien l'année a la fin si elle existe

j'ai ajouté dans le doute le "$" dans la condition(1)

capture
Rechercher des sujets similaires à "expressions regulieres"