Это тот случай, когда я думаю, что вам лучше сделать два прохода. Сначала извлеките все значения данных <%%>, которые являются атрибутами внутри тегов. Затем пройдите и извлеките <% и%>.
Например:
<[^>]*?((?:<%=[^%]*%>\s*)+)[^<]*>
Дает вам:
<%=foo1%> <%=foo2%>
Тогда простой
<%=(.*?)%>
на выходе из первого регулярного выражения, дает вам foo1, foo2 и т. Д. Я пытался создать комбинированное, но единственный способ сделать это - использовать операцию просмотра. Я не думаю, что это поддерживается в Ruby, и, несмотря на то, что предварительный просмотр должен был бы совпадать в одной и той же точке несколько раз, я полагаю, что большинство движков вышло бы из этого.