Comment dire à RegEx (version .NET) d'obtenir la plus petite correspondance valide au lieu de la plus grande?
Comment dire à RegEx (version .NET) d'obtenir la plus petite correspondance valide au lieu de la plus grande?
Réponses:
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.
L'opérateur non gourmand, ?
. Ainsi:
.*?
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
cab
. Si mon entrée est caaacab
et que je la recherche, a.*?b
elle renverra la chaîne complète au lieu de la courte correspondance à l'intérieur. Comment rechercherais-je en arrière à partir du b
?
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
abcabk
eta.+?k
, RegEx correspondra à la chaîne entière.