2013-03-05 4 views
2

Я пытаюсь соответствовать весь текст в блоке:Как создать многострочное регулярное выражение?

group :development do 
    gem 'test' 
end 

В контексте выше, я хочу вернуться "gem 'test'". Что я использую:

/(?<=group :development do)(.*)(?=end)/m 

Почему это не работает?

+0

Это выглядит как дубликат, смотрите здесь: http://stackoverflow.com/questions/5239997/regex-how-to-match-multiple-lines –

+1

Каким образом это не работает? – sawa

+0

[Таким образом.] (Http://www.rubular.com/r/jKf0bDZi7T) (совпадений не найдено) –

ответ

4

Я не совсем уверен, почему, но изменение .* на .*? позволяет это соответствовать.

Rubular: http://www.rubular.com/r/GaQj6cM0rk

Похоже, он должен соответствовать хорошо с .*, а также, но по какой-то причине он не появляется, чтобы быть возвратов.

Вот в Rubular когда .* используется вместо: http://www.rubular.com/r/jKf0bDZi7T

Обратите внимание, что независимо от причины такого поведения, вы должны использовать .*? так или иначе, в противном случае вы бы только найти ни одного матча с начала первой блок до конца последнего блока (если в строке было несколько блоков).

+0

Wow. Выглядит явно как ошибка в Ruby. –

+1

'. *' Ищет максимально возможное совпадение. '. *?' ищет кратчайший и предпочтительнее в большинстве случаев. – tadman

+0

Это потому, что '. *' - это «жадное совпадение», которое соответствует как можно больше, и в этом случае также ест «конец», тогда как '. *?' Является не-жадным совпадением и будет достаточно потреблять чтобы позволить остальному регулярному выражению соответствовать. –

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