Les autres réponses ne proposent pas de solution complète pour les versions de regex qui ne prennent pas en charge la correspondance non avide. Les quantificateurs gourmands ( .*?
, .+?
etc) sont une extension de Perl 5 qui n'est pas prise en charge par les expressions régulières traditionnelles.
Si votre condition d'arrêt est un seul caractère, la solution est simple : au lieu de
a(.*?)b
vous pouvez correspondre
a[^ab]*b
c'est-à-dire spécifier une classe de caractères qui exclut les délimiteurs de début et de fin.
Dans le cas plus général, vous pouvez minutieusement construire une expression comme
start(|[^e]|e(|[^n]|n(|[^d])))end
pour capturer une correspondance entre start
et la première occurrence de end
. Remarquez comment la sous-expression avec des parenthèses imbriquées présente un certain nombre d'alternatives qui permettent entre elles e
seulement s'il n'est pas suivi par nd
et ainsi de suite, en prenant soin de couvrir la chaîne vide comme une alternative qui ne correspond pas à ce qui est interdit à ce moment précis.
Bien sûr, l'approche correcte dans la plupart des cas est d'utiliser un analyseur approprié pour le format que vous essayez d'analyser, mais parfois, il se peut qu'il n'y en ait pas, ou que l'outil spécialisé que vous utilisez insiste sur une expression régulière et rien d'autre.
0 votes
Quelle est votre source, est-ce du HTML, du xml ou autre ?
26 votes
Pourquoi est-ce un wiki communautaire ? C'est une vraie question. Trop tard maintenant.
1 votes
Dans quelle langue écrivez-vous ? N'utilisez pas de regex pour le XML. Il y a tellement de meilleures façons d'analyser le XML.
3 votes
Pas si tout ce que vous voulez est de scanner pour des attributs simples. Regex est approprié et plus rapide.
0 votes
Je dirais que si vous codez par exemple en c#, il est bien mieux d'utiliser linq pour cela. Je doute que ce soit mieux d'utiliser regex si vous avez un bon analyseur syntaxique.
1 votes
En fait, la source est un fichier XML, mais je grep des balises particulières dans un fichier texte. Pour mes besoins, cette regex sera probablement suffisante.
0 votes
Merci pour vos réponses ; Daniel V obtient mon vote sur une base FIFO :)
0 votes
@WiktorStribizew il y a un méta post ici qui se demande si le duplicata ne devrait pas être inversé car l'argument est que les réponses ici sont meilleures que sur le duplicata. Je ne peux pas en juger. Juste un avertissement.