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.
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.
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.
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'.