-
Expression avec boost
Bonsoir,
N'étant pas très calé en expression régulières, je cherche depuis deux jours à valider et capturer deux sous-chaînes à l'aide de boost et d'expressions régulières, sans succès...
J'ai ces deux chaines en entrée :
" Les bébés sont illogiques"
"Seules les casseroles m'appartenant sont en fer blanc"
J'aimerais que mon expression me récupère bébés, illogiques dans un cas, et casseroles m'appartenant et en fer blanc dans l'autre.
J'ai testé cela (qui marche que pour le premier) mais qui me capture la chaîne de bébés à la fin ... C'est possible de contourner ce comportement ?
Code:
boost::regex pattern_all("^tous les|seuls les |seules les |les (.+) sont (.+)");
Merci d'avance pour votre aide.
-
Bonjour,
Tu as deux erreurs dans ton expression: un problème de priorité et des espaces en trop.
Ton expression est interprétée comme ça (parenthèse rouges ajoutées pour indiquer les priorités) :
Code:
^(tous les)|(seuls les )|(seules les )|(les (.+) sont (.+))
Pour que ça marche, il te faut commencer par mettre le début entre parenthèses et ajouter ou supprimer des espaces :
Code:
^(tous les|seuls les|seules les|les) (.+) sont (.+)
ou
Code:
^(tous les |seuls les |seules les |les )(.+) sont (.+)
2 remarques:
- Évidement, avec tes chaînes en entrée, ceci ne marche que si tu passe l’option boost::regex::icase au constructeur (expression insensible à la casse).
- Si la capture de la nouvelle sous-expression du début te gêne, tu peux écrire ceci :
Code:
^(?:tous les|seuls les|seules les|les) (.+) sont (.+)
La forme (?: ... ) permet de ne pas enregistrer la sous-expression pour utilisation ultérieure, tout en forçant les priorités (voir ici).
Des explications sur cette page.
-
Merci pour la réponse.
Pour la chaîne insensible, j'ai oublié de préciser que je met toute ma chaîne en minuscule afin d'éviter ce problème. Je comprend mieux l'erreur.
Mais j'ai continué dans mon coin ces derniers jours, et j'ai carrément changé de bibliothèque. J'ai changé comme tu as fait mon expression et ca marche. En tout cas, j'ai encore beaucoup d'efforts à faire pour comprendre les expressions régulières.