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

98

Comment dire à RegEx (version .NET) d'obtenir la plus petite correspondance valide au lieu de la plus grande?

Jonathan Allen
la source

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.

DMI
la source
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
70

L'opérateur non gourmand, ?. Ainsi:

.*?
David Hedlund
la source
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

Jonathan
la source
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