• # wtf

    Posté par  . Évalué à 2.

    Je pige pas la complexité sur les dates, le 1er exemple…

    Si on pars du principe d'une date aux formats dd/mm/yyyy, dd-mm-yyyy ou dd.mm.yyyy (copié du lien, hein) je vois pas pourquoi il faut faire:

    (?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})
    

    que j'arrive pas a lire…

    En quoi [0-9]([0-9])?[/.-][0-9]([0-9])?[/.-][0-9]{4} ça marcherais pas? Pas super lisible, mais, il file juste des regex sans explications, la…

    • [^] # Re: wtf

      Posté par  (site Web personnel) . Évalué à 5.

      Ton expression matche des dates inexistantes, comme 62/99/0000.

      il file juste des regex sans explications, la…

      c'est le but

      "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

    • [^] # Re: wtf

      Posté par  . Évalué à 5.

      Ton expression plus simple capture des dates invalides.

      Je n'ai pas pris le temps de lire la plus compliquée, mais on dirait qu'elle ne fasse correspondre que des dates valides dans le calendrier grégorien, y compris le saut de dates lors du passage du julien au grégorien.

      • [^] # Re: wtf

        Posté par  . Évalué à 4.

        @toi et @gabbros:

        ah, ok, certes, si on joue avec ça, forcément… bien vu de vous deux.

    • [^] # Re: wtf

      Posté par  . Évalué à 3. Dernière modification le 04/02/20 à 22:51.

      Ta regexp capture le 35.85.2051, qui n'est pas une date valide. La sienne, non.

      Édit : grillé deux fois.

    • [^] # Re: wtf

      Posté par  . Évalué à 2. Dernière modification le 04/02/20 à 22:53.

      sauf erreur de ma part, avec ta regex on peut faire la date suivante : 99.99-9999 qui n'est pas réellement une date.

      Laurent

      Edit : grillé 3 fois

    • [^] # Re: wtf

      Posté par  (site Web personnel) . Évalué à 5. Dernière modification le 05/02/20 à 07:59.

      En quoi [0-9]([0-9])?[/.-][0-9]([0-9])?[/.-][0-9]{4} ça marcherais pas?

      Parce que ça ne valide ni le nombre de jours, ni le nombre de mois ?

      juste des regex sans explications, la…

      Il y a un énorme schémas explicatif dans la page, sous la formule.

    • [^] # Re: wtf

      Posté par  (site Web personnel) . Évalué à 2.

      Pour répondre à tout les commentaires en même temps : son expression est aussi invalide que la tienne et capture des dates qui n’existent pas « dans la vraie vie ».

      Qui pour nous faire une regex qui marche avec la base tz ?

  • # Bof...

    Posté par  . Évalué à 6. Dernière modification le 05/02/20 à 10:29.

    Ben si le but, c'est d'aider les développeurs pour qu'ils n'aient plus à écrire les regexp eux même, ce serait bien d'en mettre des correctes !

    https://ihateregex.io/expr/email-2 : [^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+ valide mail@perso.net@elysee.fr qu'on sait être dangereuse (ça a permis cette faille par exemple), surtout que cette erreur précise ne semble pas trop dure à corriger : ([^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+){1} par exemple ; mais même comme ça, elle valide des adresse invalides, par exemple .theproblem@toto.fr.

    Bref, ce n'est pas une source fiable ! (Et je n'ai ni le temps, ni l'envie de tout vérifier/corriger)

    Par contre, les schémas explicatifs sont cools :D

    • [^] # Re: Bof...

      Posté par  . Évalué à 1.

      Oups, le lien pour cette expression c'est https://ihateregex.io/expr/email celle dans la page en lien a le problème du double @ mais (presque) pas celui du point en début d'adresse.

    • [^] # Re: Bof...

      Posté par  (site Web personnel) . Évalué à 5.

      Ben si le but, c'est d'aider les développeurs pour qu'ils n'aient plus à écrire les regexp eux même, ce serait bien d'en mettre des correctes !

      Je corrige : ce serait bien de mettre des vrais manières de valider ce genre de données (adresse email, date, etc.) en utilisant des outils adaptés.

  • # Cinq minutes ou une vie

    Posté par  . Évalué à 2.

    Une bonne cheat sheet pour pcre.

    Merci pour le lien !

    Mais ces temps-ci j'écris ce genre de choses (https://ihateregex.io/expr/date) comme ça :

    grammar rdate {
        rule  TOP        { 
            <year> <separator>  <month> <separator> <day>
        }
        token separator  { '/' || '.' || '-' }
        token year       { <[0..9]> ** 4 }
        token month      { '0'<[0..9]> || '1'<[1..2]> }
        token day        { '0'<[0..9]> || <[1..2]><[0..9]> || '3'<[0..1]> }
    }
    
    

    Mais c'est une autre histoire, et je ------->[]

    • [^] # Re: Cinq minutes ou une vie

      Posté par  . Évalué à 3. Dernière modification le 06/02/20 à 08:11.

      token month { '0'<[0..9]> || '1'<[1..2]> }

      Tu chopes le mois "10" avec ça ?

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Cinq minutes ou une vie

      Posté par  (site Web personnel) . Évalué à 5. Dernière modification le 06/02/20 à 11:10.

      0100-02-29 # non bissextile
      0000-02-30 # impossible
      2020/02.06 # séparateur fluctant
      -0400.03.02 # année avant 0 ?
      bug de l'an 9999

      • [^] # Re: Cinq minutes ou une vie

        Posté par  . Évalué à 3.

        Le but d'une regex est de valider des formats d'entrés typographique, la logique vient après.

        Vu que comme le dit 'OP, "ça va bien cinq minutes" (et que midi approche) :

        • On peut aussi ajouter du code dans la regex
        • Ou faire un post-traitement sur l'ast résultant de la la grammaire

        Juste à titre d'exemple :

        grammar rdate {
            rule  TOP        { 
                <year> <separator> <month> <separator> <day>
                { self.check(self.year,self.month,self.day,self.separator) }
            }
            token separator           { '/' || '.' || '-' }
            token year                { '-'? <[0..9]> ** 4 }
            token month               { '0'<[0..9]> || '1'<[0..2]> }
            token day                 { '0'<[0..9]> || <[1..2]><[0..9]> || '3'<[0..1]> }
            method check($y,$m,$d,$s) {
                # Code de vérification ici
            }
        }
        
        class rdate-actions {
            # Code post-traitement ici.
        }
        

        La doc pour bien commencer est ici

        Bon app'

        • [^] # Re: Cinq minutes ou une vie

          Posté par  (site Web personnel) . Évalué à 3. Dernière modification le 06/02/20 à 16:51.

          la logique vient après

          Après quoi ? Le but c’est presque toujours d’avertir l’utilisateur le plus vite possible en cas d’erreur.

          On peut aussi ajouter du code dans la regex

          Ça sert à rien si tu utilise déjà des outils qui traitent les dates correctement :

          >>> pendulum.date(year=100, month=2, day=29)
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
            File "[SNIPPED]/lib/python3.7/site-packages/pendulum/__init__.py", line 161, in date
              return Date(year, month, day)
          ValueError: day is out of range for month
          >>> pendulum.date(year=104, month=2, day=29)
          Date(104, 2, 29)
          • [^] # Re: Cinq minutes ou une vie

            Posté par  . Évalué à 1. Dernière modification le 06/02/20 à 17:27.

            Certes, dans le cas d'une date seule, il est plus facile d'utiliser les types natifs d'un langage et de les comparer avec la validité d'une entrée.

            > my $कामसूत्र = Date.new('0100-02-29');
            Day out of range. Is: 29, should be in 1..28
            
            

            Intéressant de savoir que l'année 100 a été bissextile, et qu'elle correspond à l'année de compilation des textes du कामसूत्र en Inde ….

            Mais, pour mémoire, le sujet initial était sur les regex et l'exemple donné ne l'était qu'à son propre titre, dans le contexte des regex où la logique vient après le match.

    • [^] # Re: Cinq minutes ou une vie

      Posté par  . Évalué à 2.

      Hum… du coup, comment tu écris un truc tout couillon, genre: ./foo | grep '^DEBUG[0]' avec ça?

      Nan, parce que bon, les regex, forcément, si on veut les utiliser pour remplacer flex et yacc, c'est qu'on est con… non, une regex, ça gèrera jamais du xml ou du json, parce que les regex, ça marche juste sur des trucs relativement lisibles par l'humain… genre des logs. Voire du source.

      Qui, au quotidien, utilise des regex pour choper des dates dans un format non-spécifié, à un emplacement aléatoire? Et dans quel cas?
      Je suis sûr que certains ont ce besoin, hein, il me semble évident.. mais les regex, pour ça?? C'est un peu comme utiliser xml pour un document sans dtd: overkill!

      • [^] # Re: Cinq minutes ou une vie

        Posté par  . Évalué à 1.

        Je vais m'auto-citer depuis ce post :

        l'exemple donné ne l'était qu'à son propre titre, dans le contexte des regex

        Donc cet exemple n'était pas "utile", mais démonstratif dans son concept.

        Pour parser des trucs plus complexes, si tu aimes yacc et/ou des grammaires BNF (avec des jolis pipes), libre à toi. Chacun utilise les outils qu'il veut même quand (note le point d'interrogation) on est con … non ?

        C'est étrange qu'on parle de regex, alors qu'une bonne compréhension du Français devrais suffire, mais bon les posts à la tl;dr avec réaction épidermique ça fatigue à la longue.

        • [^] # Re: Cinq minutes ou une vie

          Posté par  . Évalué à 2.

          Pour parser des trucs plus complexes, si tu aimes yacc et/ou des grammaires BNF (avec des jolis pipes), libre à toi. Chacun utilise les outils qu'il veut même quand (note le point d'interrogation) on est con … non ?

          Mais, moi, j'aime les jolies pipes, je trouve ça esthétique. Bon, ok, pardon pour le jeux de mot pourri.

          Pour le reste, désolé. Je n'ai pas de bonne excuse pour le manque de recul dont je fais preuve en ce moment.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.