763 votes

Expression régulière qui s'arrête à la première correspondance

Mon modèle de regex ressemble à quelque chose comme

<xxxx location="file path/level1/level2" xxxx some="xxx">

Je ne suis intéressé que par la partie entre guillemets affectée à l'emplacement. Cela ne devrait-il pas être aussi simple que ci-dessous sans le commutateur gourmand ?

/.*location="(.*)".*/

Cela ne semble pas fonctionner.

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.

1515voto

Daniel Vandersluis Points 30498

Vous devez rendre votre expression régulière non gourmande, car par défaut, "(.*)" correspondra à tous les éléments suivants "file path/level1/level2" xxx some="xxx" .

Au lieu de cela, vous pouvez rendre votre étoile ponctuelle non gourmande, ce qui lui permettra de correspondre au moins de caractères possible :

/location="(.*?)"/

Ajout d'un ? sur un quantificateur ( ? , * ou + ) le rend non avide.

45 votes

Au cas où vous utiliseriez VIM, cette regex doit être légèrement différente : au lieu de .*? c'est .\{-} pour une correspondance non gourmande.

58 votes

Merci Daniel. "L'ajout d'un ? sur un quantificateur ( ?, * ou +) le rend non avare." est un conseil utile pour moi.

13 votes

Le ? décrit ma confusion en essayant de résoudre ce problème. Comme c'est approprié.

80voto

sepp2k Points 157757

location="(.*)" correspondra à partir du " après location= jusqu'à ce que le " après some="xxx à moins que vous ne le rendiez non avide. Donc soit vous avez besoin .*? (c.-à-d. le rendre non gourmand) ou mieux remplacer .* avec [^"]* .

7 votes

[^"]* est aussi probablement plus rapide avec la plupart des moteurs regex car il n'a pas besoin de chercher le motif après le motif actuel.

1 votes

@Kip : Vous avez probablement raison, mais le .*? est plus générale que la notation [^"]*

0 votes

Et si je veux inclure le caractère de délimitation en utilisant [^"]* ?

40voto

user193690 Points 1

Et si

.*location="([^"]*)".*

Cela évite la recherche illimitée avec .* et correspondra exactement à la première citation.

1 votes

En raison de divergences dans grep le modèle ci-dessus devrait être le modèle préféré si la portabilité est une préoccupation.

36voto

codenheim Points 6836

Utilisez une correspondance non avide, si votre moteur le supporte. Ajoutez le ? à l'intérieur de la capture.

/location="(.*?)"/

20voto

Uddhav Gautam Points 3522

Utilisation des quantificateurs paresseux ? sans drapeau mondial est la réponse.

Eg,

enter image description here

Si vous aviez un drapeau global /g alors, il aurait fait correspondre toutes les correspondances de longueur inférieure comme ci-dessous. enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X