Negative Lookahead et capture incomplète

[Résolu]
Signaler
-
Messages postés
16263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 septembre 2021
-
Bonjour,
J'ai la règle suivante
 "(texte\w*)(?!@@.*)",

pour conserver tout ce qui commence par "texte" en ignorant les "@@" et ce qui suit.
J'applique les textes suivante :
"texte_a_garder1" 

et
 "texte_a_garder2@@a_ignorer"

mais la seconde capture est incomplète, il manque le 2, je n'ai que "texte_a_garder1" et "texte_a_garder".
Par contre, si j'utilise la règle
 "(texte\w*)(?!@@@.*)"

avec trois "@", cela fonctionne correctement, et celle-ci aussi
 "(texte\w*)(?!@@.*)?"

J'ai fais l'essai en Python et sur le site "regex101.com" avec le même résultat.
Avez-vous une idée sur le sujet, je ne trouve rien de mon côté.

6 réponses

Messages postés
16263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 septembre 2021
562
Bonjour

Tu as essayé sur regex101 c’est super, ce qui serait encore mieux, c’est de mettre le lien vers ton test.

Bonjour,
Voici le lien :
https://regex101.com/r/cqQ7Ey/1
Messages postés
16263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 septembre 2021
562
Ton pattern dit qu’il ne faut pas qu’il y a 2 @ après la capture, donc la capture s’arrête avant de trouver 2 @ soit, quand elle trouve un chiffre et 1 @.
Une solution qui marche avec tes 2 exemples est
 (texte\w*)[^(@@)] 
https://regex101.com/r/cqQ7Ey/2
Ton cas donne le même résultat que moi, le "group 1" est incomplet, l'ajout du "?" en fin de règle fonctionne : (texte\w*)[^(@@)]?
Les règles suivantes aussi :
(texte\w*)(?!@@.*)? et (texte\w*)(?!@.*)?
La seconde si on ignore tout après le premier "@".
Dans tous les cas, il faut apparemment quantifier le "Negative lookahead group" pour que cela fonctionne.
https://regex101.com/r/2sIiWm/1
https://regex101.com/r/yObRBx/1
Messages postés
16263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 septembre 2021
562
Dans ta question tu as parlé de capture pas de groupe, ma regex donne une capture complète, je ne me suis pas intéressé au groupe.

Mais les 2 patterns que tu as trouvé te conviennent tant mieux.

Pense à marquer le sujet résolu
Les solutions fonctionnent toutes, mais l'utilisation du "?" en fin de règle reste étrange pour moi.
Messages postés
16263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 septembre 2021
562
Il veut dire que le « morceau » de pattern juste avant est présent ou pas. Si tu ne le mets pas ça ne marche pas pour ton exemple sans @