2010-03-23 6 views
330
modèle

Mon regex ressembleExpression régulière pour arrêter au premier match

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

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

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

Cela ne semble pas fonctionner.

+0

Quelle est votre source, est-ce HTML ou XML ou quelque chose? –

+14

Pourquoi est-ce un wiki communautaire? C'est une vraie question. Trop tard maintenant. –

+0

@Kurresmack C'est XML. – publicRavi

Répondre

686

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

Au lieu de cela, vous pouvez faire votre point étoiles non gourmand, qui fera correspondre à moins de caractères possible:

/location="(.*?)"/ 

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

+25

FWIW, en utilisant votre VIM, cette regex doit être un peu différente: au lieu de '. *?' C'est '. \ {-}' pour une correspondance non-gourmande. – SooDesuNe

+24

Merci Daniel. ** "Ajouter un? Sur un quantificateur (?, * Ou +) le rend non gourmand." ** est un conseil utile pour moi. – PhatHV

+5

Le? décrit ma confusion en essayant de comprendre cela. Comme approprié. –

11

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

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

location="(.*)" correspondront de la « après location= jusqu'à ce que le » après some="xxx à moins que vous le rendre non-gourmand. Vous avez donc besoin soit de .*? (c'est-à-dire de le rendre non gourmand), soit de remplacer .* par [^"]*.

+5

+1, '[^"] * "' est plus clair que '. *?" 'N'importe quel jour – Kip

+3

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

+1

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

20

Que diriez-vous

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

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

Questions connexes