Comment puis-je écrire un regex qui correspond à non greedy?

j'ai besoin d'aide sur l'appariement des expressions régulières avec l'option non-cupide.

Le match motif est:

<imgs.*>

Le texte de match est:

<html>
<img src="test">
abc
<img
  src="a" src='a' a=b>
</html>

je l'ai tester sur http://regexpal.com

cette expression correspond à tous les textes de <img à la dernière > . J'en ai besoin pour correspondre avec le premier rencontré > après le premier <img , donc ici, j'aurais besoin de deux allumettes au lieu de celle que j'ai.

j'ai essayé toutes les combinaisons de non-greedy ? , sans succès.

231
demandé sur Peter Mortensen 2012-08-10 13:37:40

3 réponses

Le non-greedy ? fonctionne parfaitement bien. C'est juste que vous devez sélectionner dot correspond à toutes les options dans les moteurs regex ( regexpal , le moteur que vous avez utilisé, a aussi cette option) que vous testez avec. En effet, les moteurs regex ne correspondent généralement pas aux sauts de ligne lorsque vous utilisez . . Vous devez leur dire explicitement que vous voulez faire correspondre line-breaks aussi avec .

par exemple,

<img\s.*?>

fonctionne très bien!

vérifiez les ici .

aussi, lisez à propos de comment point se comporte dans diverses saveurs de regex.

337
répondu Pavan Manjunath 2017-07-18 16:10:37

l'opérande ? rend match non-greedy. Par exemple: .* est cupide alors que .*? ne l'est pas. Donc vous pouvez utiliser quelque chose comme <img.*?> pour faire correspondre l'étiquette entière. Ou <img[^>]*> .

mais rappelez-vous que L'ensemble du HTML ne peut pas être divisé avec des expressions régulières.

57
répondu Ilya 2017-07-18 16:11:58

Vérification de Débordement de Pile question Ce n'paresseux et gourmand dans le contexte des expressions régulières? ainsi.

Greedy signifie la chaîne la plus longue possible.

paresseux signifie correspondre chaîne la plus courte possible.

par exemple, le gourmand H.+l correspond 'hell' dans 'hello', mais le H + paresseux?l corresponds 'hel'.

2
répondu Rahul 2017-07-18 16:13:01