2013-07-18 3 views
2

Я сопрягать линию против шаблона, что-то вроде:Perl - регулярные выражения первого появления группы

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

но, проблема в том, что у меня есть, в строке, много вхождений «someRegExp (. *) someOtherRegExp "

Не могли бы вы рассказать мне, как я могу выбрать, наверняка!, первое появление?

спасибо!

+0

Попробуйте: '/ someRegExp (. *?) SomeOtherRegExp /'. Не используйте '. *' Или '. *?', Если вы не забираете их совпадения. – shawnhcorey

ответ

2

Вам необходимо сделать ваши кванторы не жадными. * жадный по умолчанию, что означает, что он пытается захватить как можно больше. Для того, чтобы не жадный, добавить ?:

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

Сделайте свой квантор неохотой до этой части регулярных выражений:

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

Теперь .*? будет только соответствовать строке перед первой подстроки, соответствующей шаблону после него ,

+0

Является ли «неохотным» реальный термин? –

+0

@NathanFellman. Да, это другое имя для [Lazy quantifier] (http://www.regular-expressions.info/repeat.html). Прочитайте пункт под заголовком ** «Лень вместо жадности» ** в этой ссылке. –

+0

Я буду вынужден продвигать хотя бы потому, что сегодня узнал что-то новое :-) –

Смежные вопросы