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

  1. ###raw>post.musername###
    Membre régulier
    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,
      0  0

  2. #2
    Membre expert
    Quel compilateur et quelle version ? Par exemple, g++-4.8 n'a pas un support complet des regex.

  3. #3
    Membre régulier
    gcc 4.9 et clang 3.5, même probléme
    Ca marche avec http://libcxx.llvm.org/ + clang 3.5
    Developpeur d'Ultracopier et Supercopier
    CatchChallenger, mmorpg old school hautes performances, insensible aux latences, support de i2p/tor, multiple gameplay.

  4. #4
    Membre expert
    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
    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.
    Developpeur d'Ultracopier et Supercopier
    CatchChallenger, mmorpg old school hautes performances, insensible aux latences, support de i2p/tor, multiple gameplay.

  6. #6
    Membre expert
    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
    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)
    Developpeur d'Ultracopier et Supercopier
    CatchChallenger, mmorpg old school hautes performances, insensible aux latences, support de i2p/tor, multiple gameplay.

  8. #8
    Rédacteur/Modérateur

    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
    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
    [0-9]+
    Dans:
    • fghdfg9dfg
    • fghdfgdfg

    Meme chose, not match
    Developpeur d'Ultracopier et Supercopier
    CatchChallenger, mmorpg old school hautes performances, insensible aux latences, support de i2p/tor, multiple gameplay.

  11. #11
    Membre expert
    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-2...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
    1) pas ici, quel code est utilisé?
    4) [0-9]+
    Dans:
    fghdfg9dfg
    fghdfgdfg
    Alors que avec Qt et php ca marche.
    Developpeur d'Ultracopier et Supercopier
    CatchChallenger, mmorpg old school hautes performances, insensible aux latences, support de i2p/tor, multiple gameplay.

  13. #13
    Expert éminent sénior
    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