2013-07-18 3 views
2

Je suis correspondant à une ligne contre un modèle, quelque chose comme:Perl - expressions régulières première occurrence du groupe

 
if (/.*someRegExp(.*)someOtherRegExp.*/) 
{ 
process $1 
} 

mais le problème est que j'ai, dans la ligne, de nombreuses occurrences de « someRegExp (. *) someOtherRegExp "

Pouvez-vous s'il vous plaît me dire comment puis-je sélectionner, pour sûr, la première occurrence?

merci!

+0

Essayez: '/ someRegExp (. *?) SomeOtherRegExp /'. N'utilisez pas '. *' Ou '. *?' 'Sauf si vous capturez leurs correspondances. – shawnhcorey

Répondre

2

Vous devez rendre vos quantificateurs non gourmands. * est gourmand par défaut, ce qui signifie qu'il essaie de capturer autant que possible. Pour ce faire pas gourmand, ajouter ?:

if (/.*?someRegExp(.*?)someOtherRegExp.*?/) 
{ 
    process $1 
} 
2

Faites votre quantificateurs réticente avant cette partie de regex:

if (/.*?someRegExp(.*)someOtherRegExp.*/) 
{ 
    process $1 
} 

Maintenant, .*? ne fera que correspondre à la chaîne avant la première sous-chaîne correspondant au modèle le suivant .

+0

Est "réticent" le terme réel? –

+0

@NathanFellman. Oui c'est un autre nom pour [quantificateur paresseux] (http://www.regular-expressions.info/repeat.html). Lire para sous la rubrique ** Paresse au lieu de la gourmandise ** dans ce lien. –

+0

Je vais devoir upvote si seulement parce que j'ai appris quelque chose de nouveau aujourd'hui :-) –