J'ai une .NET REGEX que je passe à l'aide de Windows PowerShell. La sortie est la suivante:
> [System.Text.RegularExpressions.Regex]::Match("aaa aaa bbb", "aaa.*?bbb") Groups : {aaa aaa bbb} Success : True Captures : {aaa aaa bbb} Index : 0 Length : 11 Value : aaa aaa bbb
4 Réponses :
Comparer le résultat de la chaîne AAA AAA BBB BBB CODE>:
regex: aaa.*?bbb
result: aaa aaa bbb
regex: aaa.*bbb
result: aaa aaa bbb bbb
C'est l'explication la plus rapide de ce qui se passe. +1
Eh bien c'est vraiment simple, nous avons la chaîne suivante p>
AAA AAA BBB P> blockQuote>
Voyons que nous avons cette regex
aaa. *? BBB code>. Le moteur Regex commencera par
aaa code> p>
AAA forte> AAA BBB P> blockQuote> Le moteur Regex a maintenant
. *? BBB code>. Il procédera à l'espace
code> p>
aaa espace fort> AAA BBB P> blockQuote>
Mais nous avons toujours des caractères jusqu'à ce que
BBB code>? Donc, le moteur REGEX continuera de la manière et correspond à la deuxième série d'un P>
aaa
espace AAA strong> BBB P> blockQuote> Enfin, le moteur Regex correspondra à
BBB code>: p>
aaa aaa
BBB forte> p> blockQuote>
Voyons donc, si nous voulons seulement faire correspondre la seconde
aaa code>, nous pourrions utiliser la regex suivante: p>
(? , cela signifie correspondre à
AAA code> qui n'est pas au début de la phrase. P>
Nous pouvons également utiliser
aaa (? = BBB). *? BBB code>, cela signifie correspondant à
aaa code> suivi de
espace BBB code> . P>
Voir le fonctionnement
1 strong> - 2 strong>. p> vient de venir à mes sens, mais pourquoi n'utilisez-vous pas directement
aaa bbb code>? p>
Ce n'est pas un problème gourmand / paresseux. Le problème vient au fait que votre chaîne est analysée de gauche à droite. Lorsque le premier Notez qu'avec un comportement gourmand, dans votre exemple, vous obtenez le même résultat: le premier aaa code> est apparié, le moteur Regex ajoutez des caractères un par un pour avoir le motif complet. P>
AAA code> est assorti, le moteur Regex Prenez tous les derniers caractères et caractères en arrière par caractère jusqu'à ce que le personnage soit terminé. match. p>
Ceci est un malentendu courant. Les quantificats paresseux ne garantissent pas le match le plus court possible. Ils ne garantissent que le quantificateur actuel, de la position actuelle, ne correspond pas à plus de caractères que nécessaire pour une correspondance globale.
Si vous voulez vraiment assurer la correspondance la plus courte possible, vous devez apporter cela explicite. Dans ce cas, cela signifie qu'au lieu de . *? Code>, vous voulez un sous-crégex qui correspond à tout ce qui n'est ni
AAA code> ni
BBB code>. La regex résultante sera donc p>
Je viens de faire ce que j'aurais dû faire en premier lieu et j'ai consulté le chapitre correspondant de Friedl. Cela m'a conduit à AAA ((?! AAA).) * BBB code>, qui est plus ou moins ce que vous avez dit, sauf que votre réponse a les détails ajoutés de la non-capture de la subexpression et des tests Pour BBB dans le regard négatif. Bonne réponse.