IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

terminate called after throwing an instance of 'std::regex_error'


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut terminate called after throwing an instance of 'std::regex_error'
    Bonjour,

    Dans ce code:
    https://github.com/alphaonex86/Catch...erver.cpp#L101
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlobalServerData::serverPrivateVariables.datapack_rightFileName	= std::regex(DATAPACK_FILE_REGEX);
    https://github.com/alphaonex86/Catch...Variable.h#L59
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DATAPACK_FILE_REGEX "^[0-9/a-z\\.\\- _]*[0-9a-z]\\.[a-z]{2,4}$"
    J'ai au runtime:
    terminate called after throwing an instance of 'std::regex_error'
    J'a tout essayer, std::regex_constants::extended, ...
    Un exemple simple ne pas pas de problème, donc je ne sais reproduire un cas d'erreur minimal.
    gcc 4.9 et clang 3.5

    Cordialement,
    Développeur d'Ultracopier

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Quel compilateur et quelle version ? Par exemple, g++-4.8 n'a pas un support complet des regex.

  3. #3
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    gcc 4.9 et clang 3.5, même probléme
    Ca marche avec http://libcxx.llvm.org/ + clang 3.5
    Développeur d'Ultracopier

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Cela me semble être un bug de libstdc++ qui essaye de construire un interval plutôt que considérer le caractère '-' comme un caractère normal. Tu peux mettre le tiret autre part (généralement en premier et sans antislash, les algorithmes (POSIX/ECMAScript) et les implémentations ont des comportements plus ou moins surprenants avec le tiret).

  5. #5
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Cela me semble être un bug de libstdc++ qui essaye de construire un interval plutôt que considérer le caractère '-' comme un caractère normal.
    J'ai aussi le bug avec une regex simple, une regex vide.
    Hélas, il semble que je vais devoir faire avec clang/llvm jusqu'as avoir une solution avec gcc. Mais j'aimerai savoir a partir de quel version de gcc c'est ok.
    La sortie est prévu dans 1-2ans, donc j'espére de ce sera ok à ce moment la.
    Développeur d'Ultracopier

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Normalement à partir de 4.9, le support des expressions régulières est complet.

    En tout cas, en mettant le tiret au début, je n'ai plus le problème avec la 4.9.3, ni avec la 5.2.1.

    C'est une version de compilateur officielle ou compilée pour un IDE ?

  7. #7
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Idem ici, d'un coup ca marche.

    Plusieurs question annexe:
    1) pourquoi la regex [-0-9/a-z\._]*[0-9a-z]\.[a-z]{2,4} via le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        try {
            std::regex reg(ui->regex->text().toStdString());
            if(std::regex_match(ui->regex->text().toStdString(),reg))
                ui->label->setText("Text match");
            else
                ui->label->setText("Text not match");
        } catch (std::regex_error e) {
             ui->label->setText(QString("Regex bug: %1 %2").arg(e.what()).arg(e.code()));
        }
    ne match pas test-toto.txt
    2) pourquoi cette différence entre compilateur? Doit je reporter?
    3) pourquoi les regex sont compiler au runtime et pas a la compilation du programme? (ce qui éviterai de voir les bugs après coup)
    Développeur d'Ultracopier

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le - a une signification particuliere dans un pattern, pour matcher un - il faut l'echapper [0-9/a-z\.\-_]*[0-9a-z]\.[a-z]{2,4}
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Dans des crochets, le trait d'union doit être le premier ou dernier caractère à moins qu'il s'agisse d'un intervalle. Il n'est nul besoin de l'échapper.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0-9a-fA-F._ -] #Chiffres hexadécimaux, points, underscore, espace, trait d'union
    The hyphen character shall be treated as itself if it occurs first (after an initial '^', if any) or last in the list, or as an ending range point in a range expression. As examples, the expressions "[-ac]" and "[ac-]" are equivalent and match any of the characters 'a', 'c', or '-' ; "[^-ac]" and "[^ac-]" are equivalent and match any characters except 'a', 'c', or '-' ; the expression "[%--]" matches any of the characters between '%' and '-' inclusive; the expression "[--@]" matches any of the characters between '-' and '@' inclusive; and the expression "[a--@]" is either invalid or equivalent to '@', because the letter 'a' follows the symbol '-' in the POSIX locale. To use a hyphen as the starting range point, it shall either come first in the bracket expression or be specified as a collating symbol; for example, "[][.-.]-0]", which matches either a right bracket or any character or collating element that collates between hyphen and 0, inclusive.
    source : http://pubs.opengroup.org/onlinepubs...bd_chap09.html §1.3.5.7
    -- Yankel Scialom

  10. #10
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    [0-9]+
    Dans:
    • fghdfg9dfg
    • fghdfgdfg

    Meme chose, not match
    Développeur d'Ultracopier

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Dans des crochets, le trait d'union doit être le premier ou dernier caractère à moins qu'il s'agisse d'un intervalle.
    Pas en ECMAScript: http://ecma-international.org/ecma-262/5.1/#sec-15.10 et http://en.cppreference.com/w/cpp/reg...racter_classes
    Et certaines implémentations ne prennent pas en compte l'algorithme pour '-' (source: l'implémentation de gcc 4.9.3 ).

    @alpha_one_x86

    1) Bug, mettre '/' en fin fait matcher. Testé avec 4.9.1, bug non reproduit en 5.1.

    2) Peut-être, il faut vérifier si ce n'est déjà fait ou corrigé sur des versions plus récentes (avec coliru par exemple).

    3) Pas dans le standard, car extrêmement compliquée. Cela existe dans boost sous forme de DSL.

    [0-9]+
    Dans:

    fghdfg9dfg
    fghdfgdfg
    Il y a une différence entre regex_match et regex_search

  12. #12
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    1) pas ici, quel code est utilisé?
    4) [0-9]+
    Dans:
    fghdfg9dfg
    fghdfgdfg
    Alors que avec Qt et php ca marche.
    Développeur d'Ultracopier

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Comme le souligne jo_link_noir, il faut bien comprendre la différence:
    • regex_match requiert une correspondance de toute la chaine,
    • regex_search se contente de détecter une correspondance dans la chaine.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2014, 11h36
  2. Réponses: 6
    Dernier message: 02/04/2014, 17h06
  3. Réponses: 6
    Dernier message: 14/02/2012, 10h39
  4. Réponses: 6
    Dernier message: 19/07/2006, 10h41
  5. Réponses: 4
    Dernier message: 11/02/2006, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo