Groupe de capture optionnel Regex?
Après des heures de recherche j'ai décidé de poser cette question. Pourquoi cette expression régulière: ^(dog).+?(cat)?
ne fonctionne pas comme je pense que cela devrait fonctionner (capturer le premier chien et chat si il est tout)? Ce qui me manque ici?
dog, cat
dog, dog, cat
dog, dog, dog
source d'informationauteur forsajt
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous n'obtenez pas une option
cat
après une contrecœur qualifiés.+?
est qu'il est facultatif et non ancré: le moteur n'est pas forcé de faire ce match, parce qu'il peut légalement traiter lacat
que la "queue" de la.+?
séquence.Si yo ancre le chat à la fin de la chaîne, c'est à dire utiliser
^(dog).+?(cat)?$
vous obtiendrez un match, si:Ce estampes (démo 1)
Vous pouvez traiter avec elle par la construction d'une plus délicat expression qui correspond à rien, sauf
cat
comme ceci:Maintenant la
cat
pourrait arriver n'importe où dans la chaîne sans un point d'ancrage (démo 2).@dasblinkenlight la réponse est génial, mais voici une regexp qui améliore la 2ème partie de celui-ci quand il/elle est posé
La regexp
^(dog)(.+(cat))?
faudrait que vous capturer de groupe. 3 au lieu de 2 pour obtenir l'option de chat, mais fonctionne tout aussi bien sans le char par char supercherie.Et voici la démo (qui, rappelons-le, est fourchue de @dasblinkenlight la démo qui m'a permis de bricoler et de trouver cette solution, merci encore!)
@figha de l'extension peut être prolongé un peu plus loin encore, pour ne pas faire de l'inutile deuxième capture.
Utilisation
?:
pour faire une partie entre crochets d'une regex non capturable. Donc la regex devient:^(dog)(?:.+(cat))?
Encore une fois, voici le étendue de démonstration et la regex tester.