web-dev-qa-db-fra.com

Expression régulière pour arrêter au premier match

Mon motif de regex ressemble à quelque chose comme

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

Je ne m'intéresse qu'à la partie entre guillemets affectée à l'emplacement. Ne devrait-il pas être aussi facile que ci-dessous sans le commutateur glouton? 

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

Ne semble pas fonctionner.

414
publicRavi

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

Au lieu de cela, vous pouvez rendre votre point-star non-gourmand, ce qui lui fera correspondre le moins de caractères possible:

/location="(.*?)"/

L'ajout d'un ? sur un quantificateur (?, * ou +) le rend non-gourmand.

860
Daniel Vandersluis

location="(.*)" correspondra du "after location= au" after some="xxx à moins que vous ne le rendiez pas gourmand. Donc, soit vous avez besoin de .*? (c’est-à-dire que vous le fassiez sans être glouton) ou vous remplacez mieux .* par [^"]*.

46
sepp2k

Que diriez-vous

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

Cela évite la recherche illimitée avec. * Et correspondra exactement au premier devis.

26
user193690

Utilisez une correspondance non gourmande si votre moteur le permet. Ajouter le ? à l'intérieur de la capture.

/location="(.*?)"/
16
codenheim

L'utilisation de quantificateurs Lazy ? sans indicateur global est la réponse. 

Par exemple, 

 enter image description here

Si vous aviez le drapeau global /g alors, il aurait correspondu à toutes les correspondances de longueur les plus basses comme ci-dessous.  enter image description here

7
Uddhav Gautam