RegEx: correspondance la plus petite possible ou correspondance non régal


Réponses:


192

Pour une expression régulière comme .*ou .+, ajoutez un point d'interrogation ( .*?ou .+?) pour faire correspondre le moins de caractères possible. Pour éventuellement faire correspondre une section (?:blah)?mais sans correspondance sauf si c'est absolument nécessaire, utilisez quelque chose comme (?:blah){0,1}?. Pour une correspondance répétée (utilisant {n,}ou {n,m}syntaxique), ajoutez un point d'interrogation pour essayer d'en faire correspondre le moins possible (par exemple {3,}?ou {5,7}?).

La documentation sur les quantificateurs d'expressions régulières peut également être utile.


7
Je ne sais pas, si je suis le seul à avoir ce malentendu, mais il est important de noter: s'il est vrai que l'opérateur non gourmand correspondra au moins de caractères possible, il se peut que ce ne soit toujours pas celui que l'on recherche. pour. «Aussi peu de caractères que possible» n'équivaut pas à «correspondance la plus courte possible» en ce qui concerne les normes RegEx. Voir la réponse ci-dessous mon commentaire: Avec abcabket a.+?k, RegEx correspondra à la chaîne entière.
finefoot

Line2 "mais sans correspondance sauf si c'est absolument nécessaire": Qu'est-ce que cela signifie?
pleut du


45

L'opérateur non gourmand ne signifie pas la correspondance la plus courte possible:

abcabk

a.+?k correspondra à la chaîne entière (dans cet exemple) au lieu des trois derniers signes uniquement.

J'aimerais plutôt trouver la plus petite correspondance possible.

C'est la dernière correspondance possible pour « a» pour permettre toujours toutes les correspondances k.

Je suppose que le seul moyen de le faire est d'utiliser une expression comme:

a[^a]+?k


2
Ou recherchez dans l'ordre inverse, en commençant par la fin, lorsque les correspondances sont imbriquées: "(ab (abk) bk)".
LBogaardt

7
@LBogaardt comment rechercherait-on dans l'ordre inverse? Don't get it
azerafati

2
@LBogaardt Question toujours ouverte: comment rechercherait-on dans l'ordre inverse? Disons que je veux obtenir cab. Si mon entrée est caaacabet que je la recherche, a.*?belle renverra la chaîne complète au lieu de la courte correspondance à l'intérieur. Comment rechercherais-je en arrière à partir du b?
C4d

3
Inversez la chaîne, puis appliquez l'expression régulière.
Jonathan Allen

3
C'est super utile. Pour les gens comme moi qui essaient de comprendre ce qui se passe ici, le formulaire générique est START[^START]*?END(où START et END sont vos expressions régulières de début et de fin). Cela signifie essentiellement "correspond à tout ce qui va de START à END où les caractères
intermédiaires
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.